xiuos/Ubiquitous/XiZi_AIoT/softkernel/tools/queue.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++;
}