aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-03-10 17:11:23 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-03-10 17:11:23 +0000
commitc1a34b0614ab9e24570338ac4c5aab1c8366a6b2 (patch)
treea94fe9fa6dce9be33d3839f6852e1f33ca8fd350
parent72df3d8292c5c0c5713c88ded50b12b2226c56d9 (diff)
keep semaphore flag on if waiting task goes in runq
skip scheduling if waitq empty
-rw-r--r--kernel/kernel.c13
1 files 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