ptos: sched: Add thread enqueue/dequeue helpers
Signed-off-by: Chloe M <chloe@mensia.org>
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
#define _KE_SCHED_H_ 1
|
#define _KE_SCHED_H_ 1
|
||||||
|
|
||||||
#include <ps/thread.h>
|
#include <ps/thread.h>
|
||||||
|
#include <ke/spinlock.h>
|
||||||
#include <ptdef.h>
|
#include <ptdef.h>
|
||||||
#include <queue.h>
|
#include <queue.h>
|
||||||
|
|
||||||
@@ -19,15 +20,33 @@
|
|||||||
*
|
*
|
||||||
* @ThreadQueue: Represents the actual queue that holds threads
|
* @ThreadQueue: Represents the actual queue that holds threads
|
||||||
* @QueueEntries: Represents the number of entries in the queue
|
* @QueueEntries: Represents the number of entries in the queue
|
||||||
|
* @Lock: Lock protecting this queue
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
TAILQ_HEAD(, _THREAD) ThreadQueue;
|
TAILQ_HEAD(, _THREAD) ThreadQueue;
|
||||||
USIZE QueueEntries;
|
USIZE QueueEntries;
|
||||||
|
SPINLOCK Lock;
|
||||||
} SCHED_QUEUE;
|
} SCHED_QUEUE;
|
||||||
|
|
||||||
/* Macro used to initialize the scheduler queue */
|
/* Macro used to initialize the scheduler queue */
|
||||||
#define SCHED_QUEUE_INIT(SQ_P) \
|
#define SCHED_QUEUE_INIT(SQ_P) \
|
||||||
TAILQ_INIT(&(SQ_P)->ThreadQueue); \
|
TAILQ_INIT(&(SQ_P)->ThreadQueue); \
|
||||||
(SQ_P)->QueueEntries = 0;
|
(SQ_P)->QueueEntries = 0; \
|
||||||
|
KeSpinLockInit(&(SQ_P)->Lock, "sched");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enqueue a thread to a scheduler queue
|
||||||
|
*
|
||||||
|
* @Queue: Scheduler queue to add to
|
||||||
|
* @Thread: Thread to enqueue
|
||||||
|
*/
|
||||||
|
VOID KeSchedEnqueue(SCHED_QUEUE *Queue, THREAD *Thread);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dequeue a thread from a scheduler queue
|
||||||
|
*
|
||||||
|
* @Queue: Scheduler queue to dequeue from
|
||||||
|
*/
|
||||||
|
THREAD *KeSchedDequeue(SCHED_QUEUE *Queue);
|
||||||
|
|
||||||
#endif /* !_KE_SCHED_H_ */
|
#endif /* !_KE_SCHED_H_ */
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Scheduler management
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ke/sched.h>
|
||||||
|
|
||||||
|
VOID
|
||||||
|
KeSchedEnqueue(SCHED_QUEUE *Queue, THREAD *Thread)
|
||||||
|
{
|
||||||
|
if (Queue == NULL || Thread == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeSpinLockAcquire(&Queue->Lock, true);
|
||||||
|
TAILQ_INSERT_TAIL(&Queue->ThreadQueue, Thread, ThreadLink);
|
||||||
|
KeSpinLockRelease(&Queue->Lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
THREAD *
|
||||||
|
KeSchedDequeue(SCHED_QUEUE *Queue)
|
||||||
|
{
|
||||||
|
THREAD *Thread;
|
||||||
|
|
||||||
|
KeSpinLockAcquire(&Queue->Lock, true);
|
||||||
|
if (TAILQ_EMPTY(&Queue->ThreadQueue)) {
|
||||||
|
KeSpinLockRelease(&Queue->Lock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread = TAILQ_FIRST(&Queue->ThreadQueue);
|
||||||
|
TAILQ_REMOVE(&Queue->ThreadQueue, Thread, ThreadLink);
|
||||||
|
KeSpinLockRelease(&Queue->Lock);
|
||||||
|
return Thread;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user