From b5f5a40fbcf0a0b40c6d024c25dac2dad9363486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Mon, 19 Feb 2018 10:24:47 +0100 Subject: [PATCH] Further queue improvements --- src/kernel/include/queue.h | 8 ++++++++ src/kernel/include/queue.tt | 15 +++++++++++++++ src/kernel/include/scheduler.h | 4 ++-- src/kernel/include/thread.h | 2 +- src/kernel/proc/scheduler.c | 8 +++----- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/kernel/include/queue.h b/src/kernel/include/queue.h index b7359f9..096fdfa 100644 --- a/src/kernel/include/queue.h +++ b/src/kernel/include/queue.h @@ -50,3 +50,11 @@ #define _QUEUE_PEEK(queue, entry, type) \ (queue.first) #define queue_peek(...) _QUEUE_PEEK(__VA_ARGS__) + +#define _QUEUE_POP(queue, entry, type) \ + __extension__({ \ + type *_ret = _QUEUE_PEEK(queue, entry, type); \ + _QUEUE_DROP(queue, entry, type); \ + _ret; \ + }) +#define queue_pop(...) _QUEUE_POP(__VA_ARGS__) diff --git a/src/kernel/include/queue.tt b/src/kernel/include/queue.tt index f7b7bfa..3105154 100644 --- a/src/kernel/include/queue.tt +++ b/src/kernel/include/queue.tt @@ -58,3 +58,18 @@ TEST(empty_reports_nonempty_queue_not_empty) queue_add(TestQ, &item1); ASSERT_EQ_INT(!!queue_empty(TestQ), 0); } + +TEST(pop_returns_queued_item) +{ + queue_add(TestQ, &item1); + struct item *i = queue_pop(TestQ); + ASSERT_EQ_INT(i->id, 1); +} +TEST(pop_removes_item_from_queue) +{ + queue_add(TestQ, &item1); + queue_add(TestQ, &item2); + queue_pop(TestQ); + struct item *i = queue_peek(TestQ); + ASSERT_EQ_INT(i->id, 2); +} diff --git a/src/kernel/include/scheduler.h b/src/kernel/include/scheduler.h index d4abad6..a98c689 100644 --- a/src/kernel/include/scheduler.h +++ b/src/kernel/include/scheduler.h @@ -1,8 +1,8 @@ #pragma once #include -#define READYQ readyQ, readyQ_next, struct thread -QUEUE_DECLARE(READYQ); +#define runQ readyQ, readyQ_next, struct thread +QUEUE_DECLARE(runQ); void ready(struct thread *th); struct thread *scheduler_next(); diff --git a/src/kernel/include/thread.h b/src/kernel/include/thread.h index d03a9e5..0bf316c 100644 --- a/src/kernel/include/thread.h +++ b/src/kernel/include/thread.h @@ -8,7 +8,7 @@ struct thread uintptr_t stack_ptr; uint64_t tid; uint64_t state; - QUEUE_SPOT(READYQ); + QUEUE_SPOT(runQ); }; diff --git a/src/kernel/proc/scheduler.c b/src/kernel/proc/scheduler.c index f671502..b1f7ef2 100644 --- a/src/kernel/proc/scheduler.c +++ b/src/kernel/proc/scheduler.c @@ -2,16 +2,14 @@ #include #include -QUEUE_DEFINE(READYQ); +QUEUE_DEFINE(runQ); void ready(struct thread *th) { - queue_add(READYQ, th); + queue_add(runQ, th); } struct thread *scheduler_next() { - struct thread *th = queue_peek(READYQ); - queue_drop(READYQ); - return th; + return queue_pop(runQ); }