Queues using some macro magic
This commit is contained in:
parent
fd0ca6f617
commit
024d772be8
39
src/kernel/include/queue.h
Normal file
39
src/kernel/include/queue.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define _QUEUE_DECL(queue, entry, type) \
|
||||||
|
struct queue{ \
|
||||||
|
type *first; \
|
||||||
|
type *last; \
|
||||||
|
}
|
||||||
|
#define QUEUE_DECL(...) _QUEUE_DECL(__VA_ARGS__)
|
||||||
|
#define _QUEUE_HEAD(queue, entry, type) \
|
||||||
|
struct queue queue
|
||||||
|
#define QUEUE_HEAD(...) _QUEUE_HEAD(__VA_ARGS__)
|
||||||
|
#define QUEUE_HEAD_EMPTY(...) _QUEUE_HEAD(__VA_ARGS__) = {0,0}
|
||||||
|
|
||||||
|
#define _QUEUE_SPOT(queue, entry, type) \
|
||||||
|
type *entry
|
||||||
|
#define QUEUE_SPOT(...) _QUEUE_SPOT(__VA_ARGS__)
|
||||||
|
|
||||||
|
#define _QUEUE_EMPTY(queue, entry, type) \
|
||||||
|
(!(queue.last))
|
||||||
|
#define QUEUE_EMPTY(...) _QUEUE_EMPTY(__VA_ARGS__)
|
||||||
|
#define QUEUE_NOT_EMPTY(...) (!(_QUEUE_EMPTY(__VA_ARGS__)))
|
||||||
|
|
||||||
|
#define _QUEUE_ADD(queue, entry, type, item) \
|
||||||
|
if(!queue.last) \
|
||||||
|
queue.first = item; \
|
||||||
|
else \
|
||||||
|
queue.last->entry = item; \
|
||||||
|
queue.last = item; \
|
||||||
|
item->entry = 0;
|
||||||
|
#define QUEUE_ADD(...) _QUEUE_ADD(__VA_ARGS__)
|
||||||
|
|
||||||
|
#define _QUEUE_DROP(queue, entry, type) \
|
||||||
|
if(!(queue.first = queue.first->entry)) \
|
||||||
|
queue.last = 0;
|
||||||
|
#define QUEUE_DROP(...) _QUEUE_DROP(__VA_ARGS__)
|
||||||
|
|
||||||
|
#define _QUEUE_PEEK(queue, entry, type) \
|
||||||
|
(queue.first)
|
||||||
|
#define QUEUE_PEEK(...) _QUEUE_PEEK(__VA_ARGS__)
|
@ -1,4 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <queue.h>
|
||||||
|
|
||||||
|
#define READYQ readyQ, readyQ_next, struct thread
|
||||||
|
QUEUE_DECL(READYQ);
|
||||||
|
QUEUE_HEAD(READYQ);
|
||||||
|
|
||||||
void ready(struct thread *th);
|
void ready(struct thread *th);
|
||||||
struct thread *scheduler_next();
|
struct thread *scheduler_next();
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <queue.h>
|
||||||
|
#include <scheduler.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
|
||||||
|
|
||||||
struct thread
|
struct thread
|
||||||
{
|
{
|
||||||
uintptr_t stack_ptr;
|
uintptr_t stack_ptr;
|
||||||
uint64_t tid;
|
uint64_t tid;
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
struct thread *next;
|
QUEUE_SPOT(READYQ);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TCB_OFFSET (PAGE_SIZE - sizeof(struct thread))
|
#define TCB_OFFSET (PAGE_SIZE - sizeof(struct thread))
|
||||||
|
@ -1,26 +1,17 @@
|
|||||||
|
#include <scheduler.h>
|
||||||
|
#include <queue.h>
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
|
|
||||||
struct {
|
QUEUE_HEAD_EMPTY(READYQ);
|
||||||
struct thread *first;
|
|
||||||
struct thread *last;
|
|
||||||
} readyQ = {0,0};
|
|
||||||
|
|
||||||
void ready(struct thread *th)
|
void ready(struct thread *th)
|
||||||
{
|
{
|
||||||
if(!readyQ.last)
|
QUEUE_ADD(READYQ, th);
|
||||||
{
|
|
||||||
th->next = 0;
|
|
||||||
readyQ.first = readyQ.last = th;
|
|
||||||
} else {
|
|
||||||
readyQ.last->next = th;
|
|
||||||
readyQ.last = th;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct thread *scheduler_next()
|
struct thread *scheduler_next()
|
||||||
{
|
{
|
||||||
struct thread *th = readyQ.first;
|
struct thread *th = QUEUE_PEEK(READYQ);
|
||||||
if(!(readyQ.first = th->next))
|
QUEUE_DROP(READYQ);
|
||||||
readyQ.last = 0;
|
|
||||||
return th;
|
return th;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user