forked from xuos/xiuos
75 lines
1.5 KiB
C
75 lines
1.5 KiB
C
|
|
|
|
#include "actracer.h"
|
|
#include "assert.h"
|
|
|
|
#include "queue.h"
|
|
|
|
struct QueueFactory {
|
|
TraceTag tag;
|
|
struct slab_allocator queue_ele_allocator;
|
|
};
|
|
static struct QueueFactory queue_factory;
|
|
|
|
void module_queue_factory_init(TraceTag* _softkernel_tag)
|
|
{
|
|
CreateResourceTag(&queue_factory.tag, _softkernel_tag, "GlobalQueueFactory", TRACER_SYSOBJECT, &queue_factory);
|
|
slab_init(&queue_factory.queue_ele_allocator, sizeof(struct QueueNode));
|
|
}
|
|
|
|
void queue_init(Queue* queue)
|
|
{
|
|
queue->front = NULL;
|
|
queue->rear = NULL;
|
|
queue->nr_ele = 0;
|
|
}
|
|
|
|
struct QueueNode* queue_front(Queue* queue)
|
|
{
|
|
return queue->front;
|
|
}
|
|
|
|
bool queue_is_empty(Queue* queue)
|
|
{
|
|
if (queue->front == NULL) {
|
|
assert(queue->nr_ele == 0);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void dequeue(Queue* queue)
|
|
{
|
|
struct QueueNode* temp = queue->front;
|
|
|
|
if (queue->front == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (queue->front == queue->rear)
|
|
queue->front = queue->rear = NULL;
|
|
else
|
|
queue->front = queue->front->next;
|
|
|
|
queue->nr_ele--;
|
|
slab_free(&queue_factory.queue_ele_allocator, (void*)temp);
|
|
}
|
|
|
|
void enqueue(Queue* queue, uintptr_t key, void* data)
|
|
{
|
|
QueueNode* temp = (struct QueueNode*)slab_alloc(&queue_factory.queue_ele_allocator);
|
|
temp->key = key;
|
|
temp->data = data;
|
|
temp->next = NULL;
|
|
|
|
if (queue->front == NULL && queue->rear == NULL) {
|
|
queue->front = queue->rear = temp;
|
|
queue->nr_ele++;
|
|
return;
|
|
}
|
|
|
|
queue->rear->next = temp;
|
|
queue->rear = temp;
|
|
queue->nr_ele++;
|
|
} |