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); }