diff --git a/kernel/include/ksched.h b/kernel/include/ksched.h index d8aecfbae9e..31ef141334e 100644 --- a/kernel/include/ksched.h +++ b/kernel/include/ksched.h @@ -43,6 +43,7 @@ void _pend_thread(struct k_thread *thread, _wait_q_t *wait_q, s32_t timeout); int _reschedule(int key); struct k_thread *_unpend_first_thread(_wait_q_t *wait_q); void _unpend_thread(struct k_thread *thread); +void _unpend_all(_wait_q_t *wait_q); void _thread_priority_set(struct k_thread *thread, int prio); void *_get_next_switch_handle(void *interrupted); struct k_thread *_find_first_thread_to_unpend(_wait_q_t *wait_q, diff --git a/kernel/mempool.c b/kernel/mempool.c index 774f7b77b70..58f07bb1b97 100644 --- a/kernel/mempool.c +++ b/kernel/mempool.c @@ -99,13 +99,7 @@ void k_mem_pool_free_id(struct k_mem_block_id *id) */ key = irq_lock(); - while (!sys_dlist_is_empty(&p->wait_q)) { - struct k_thread *th = (void *)sys_dlist_peek_head(&p->wait_q); - - _unpend_thread(th); - _ready_thread(th); - need_sched = 1; - } + _unpend_all(&p->wait_q); if (need_sched && !_is_in_isr()) { _reschedule(key); diff --git a/kernel/sched.c b/kernel/sched.c index ef7a6857bc6..a2b6624ea52 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -337,6 +337,18 @@ struct k_thread *_unpend_first_thread(_wait_q_t *wait_q) return t; } +void _unpend_all(_wait_q_t *waitq) +{ + while (!sys_dlist_is_empty(waitq)) { + struct k_thread *th = (void *)sys_dlist_peek_head(waitq); + + _unpend_thread(th); + _ready_thread(th); + need_sched = 1; + } +} + + /* Block the current thread and swap to the next. Releases the * irq_lock, does a _Swap and returns the return value set at wakeup * time