From c1a34b0614ab9e24570338ac4c5aab1c8366a6b2 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 10 Mar 2012 17:11:23 +0000 Subject: keep semaphore flag on if waiting task goes in runq skip scheduling if waitq empty --- kernel/kernel.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/kernel/kernel.c b/kernel/kernel.c index 185e0ad..edfc058 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -207,7 +207,6 @@ wait(uint8_t chan) } else { /* occupy semaphore */ kernel.semaphore |= _BV(chan); - sei(); } } @@ -219,18 +218,18 @@ signal(uint8_t chan) cli(); - /* release waiting tasks from wait queue */ if ((tp = TAILQ_FIRST(&kernel.waitq[chan]))) { + /* release first waiting task from wait queue */ TAILQ_REMOVE(&kernel.waitq[chan], tp, w_link); TAILQ_INSERT_TAIL(&kernel.runq, tp, r_link); ++kernel.rqlen; - } - /* clear semaphore */ - if (TAILQ_EMPTY(&kernel.waitq[chan])) + SCHEDULE(); + } else { + /* clear semaphore */ kernel.semaphore &= ~_BV(chan); - - SCHEDULE(); + sei(); + } } void -- cgit v1.2.3