Files
osc2025/kernel/lib/queue.c
2025-05-03 20:45:34 +08:00

88 lines
1.8 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 = (queue_t){
.size = 0,
.begin = kmalloc(sizeof(queue_node_t)),
.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)
panic(ERR_OUT_OF_BOUND);
return queue->end->prev->value;
}
uint64_t queue_front(const queue_t *queue)
{
if (!queue->size)
panic(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;
++queue->size;
}
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;
++queue->size;
}
uint64_t queue_pop_back(queue_t *queue)
{
if (!queue->size)
panic(ERR_OUT_OF_BOUND);
uint64_t ret = queue->end->prev->value;
queue->end->prev = queue->end->prev->prev;
queue->end->prev->next = queue->end;
--queue->size;
return ret;
}
uint64_t queue_pop_front(queue_t *queue)
{
if (!queue->size)
panic(ERR_OUT_OF_BOUND);
uint64_t ret = queue->begin->next->value;
queue->begin->next = queue->begin->next->next;
queue->begin->next->prev = queue->begin;
--queue->size;
return ret;
}