From 4ca0e07088a1c8e08bff3e5ab7dc61e449d5c094 Mon Sep 17 00:00:00 2001 From: Andy Ross Date: Thu, 10 May 2018 09:45:42 -0700 Subject: [PATCH] kernel: Add _unpend_all convenience wrapper to scheduler API Refactoring. Mempool wants to unpend all threads at once. It's cleaner to do this in the scheduler instead of the IPC code. Signed-off-by: Andy Ross --- kernel/include/ksched.h | 1 + kernel/mempool.c | 8 +------- kernel/sched.c | 12 ++++++++++++ 3 files changed, 14 insertions(+), 7 deletions(-) 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