Files
osc2025/kernel/lib/queue.c
2025-04-08 06:59:50 +08:00

58 lines
1.2 KiB
C

#include <queue.h>
#include <errcode.h>
#include <utils.h>
#include <kmalloc.h>
queue_t *make_queue()
{
queue_t *ret = kmalloc(sizeof(queue_t));
ret->size = 0;
ret->begin = kmalloc(sizeof(queue_node_t));
ret->end = kmalloc(sizeof(queue_node_t));
*ret->begin = *ret->end = (queue_node_t){
.prev = (queue_node_t *)ret->begin,
.next = (queue_node_t *)ret->end,
.value = 0,
};
return ret;
}
uint64_t queue_back(const queue_t *queue)
{
if (!queue->size)
exit(ERR_OUT_OF_BOUND);
return queue->end->prev->value;
}
uint64_t queue_front(const queue_t *queue)
{
if (!queue->size)
exit(ERR_OUT_OF_BOUND);
return queue->begin->next->value;
}
void queue_push_back(queue_t *queue, uint64_t val)
{
queue->end->value = val;
queue->end->next = kmalloc(sizeof(queue_node_t));
*queue->end->next = (queue_node_t){
.prev = queue->end,
.next = queue->end->next,
.value = 0,
};
queue->end = queue->end->next;
}
void queue_push_front(queue_t *queue, uint64_t val)
{
queue->begin->value = val;
queue->begin->prev = kmalloc(sizeof(queue_node_t));
*queue->begin->prev = (queue_node_t){
.prev = queue->begin->prev,
.next = queue->begin,
.value = 0,
};
queue->begin = queue->begin->prev;
}