aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-11-08 14:31:12 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-11-08 14:31:12 +0000
commitad2f8ada3cad9fb8a8dfd1a490af1e00b1ba1a01 (patch)
tree3a21655086d11084de37965f3c96d0234283a40c
parentcaaa64e5dc653aabf948afc6b334a8cc29d33e7e (diff)
insert fresh waked up tasks prior old tasks into run queue
insert unlocked tasks on head of run queue
-rw-r--r--kernel/kernel.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index bd8b629..c28ecb1 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -72,13 +72,17 @@ ISR(TIMER1_OVF_vect)
ISR(TIMER1_COMPA_vect)
{
- struct task *tp;
+ struct task *tp, *first;
uint32_t now = NOW(kern.cycles, TCNT1);
/* release waiting tasks */
+ first = TAILQ_FIRST(&kern.rq);
while ((tp = TAILQ_FIRST(&kern.tq)) && SPAN(now, tp->release) <= 0) {
TAILQ_REMOVE(&kern.tq, tp, t_link);
- TAILQ_INSERT_TAIL(&kern.rq, tp, r_link);
+ if (first)
+ TAILQ_INSERT_BEFORE(first, tp, r_link);
+ else
+ TAILQ_INSERT_TAIL(&kern.rq, tp, r_link);
}
/* set next wakeup timer */
@@ -226,7 +230,7 @@ unlock(uint8_t chan)
if ((tp = TAILQ_FIRST(&kern.wq[chan]))) {
/* release first waiting task from wait queue */
TAILQ_REMOVE(&kern.wq[chan], tp, w_link);
- TAILQ_INSERT_TAIL(&kern.rq, tp, r_link);
+ TAILQ_INSERT_HEAD(&kern.rq, tp, r_link);
} else {
/* clear semaphore and continue */
kern.semaphore &= ~_BV(chan);