initial
This commit is contained in:
93
src/server/task/taskqueue.c
Normal file
93
src/server/task/taskqueue.c
Normal file
@@ -0,0 +1,93 @@
|
||||
#include <server/task/taskqueue.h>
|
||||
|
||||
void TaskQueue_Init(task_queue_t* queue) {
|
||||
if (!queue) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVQUEUE;
|
||||
return;
|
||||
}
|
||||
|
||||
queue->tasks = DYNARR_CREATE(task_t, 1);
|
||||
}
|
||||
|
||||
void TaskQueue_DestroyQueue(task_queue_t* queue) {
|
||||
if (!queue) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVQUEUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!queue->tasks) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVPTR;
|
||||
return;
|
||||
}
|
||||
|
||||
DynArr_destroy(queue->tasks);
|
||||
}
|
||||
|
||||
void TaskQueue_AddTask(task_queue_t* queue, task_t* task) {
|
||||
if (!queue) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVQUEUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!queue->tasks) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVPTR;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!task) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVTASK;
|
||||
return;
|
||||
}
|
||||
|
||||
DynArr_push_back(queue->tasks, task);
|
||||
}
|
||||
|
||||
void TaskQueue_RemoveTask(task_queue_t* queue, size_t idx) {
|
||||
if (!queue) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVQUEUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!queue->tasks) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVPTR;
|
||||
return;
|
||||
}
|
||||
|
||||
size_t n = DynArr_size(queue->tasks);
|
||||
|
||||
if (idx >= n) { // Index adjusted
|
||||
TASK_ERR_CODE = TASK_ERR_INVIDX;
|
||||
return;
|
||||
}
|
||||
|
||||
task_t* ptr = DynArr_at(queue->tasks, idx);
|
||||
Task_DestroyArgs(ptr);
|
||||
|
||||
DynArr_remove(queue->tasks, n);
|
||||
}
|
||||
|
||||
void TaskQueue_RemoveTaskByPtr(task_queue_t* queue, task_t* task) {
|
||||
if (!queue) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVQUEUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!queue->tasks) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVPTR;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!task) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVTASK;
|
||||
return;
|
||||
}
|
||||
|
||||
size_t at = DynArr_at_ptr(queue->tasks, task);
|
||||
|
||||
if (at == SIZE_MAX) {
|
||||
TASK_ERR_CODE = TASK_ERR_INVIDX;
|
||||
return;
|
||||
}
|
||||
|
||||
DynArr_remove(queue->tasks, at);
|
||||
}
|
||||
Reference in New Issue
Block a user