From: Matthias Kruk Date: Mon, 3 Feb 2020 22:31:16 +0000 (+0900) Subject: Add simple kernel queue implementation to klibc X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=191ffb7f2f724ae5d5d4cb36d02318ee96e4624e;p=corax Add simple kernel queue implementation to klibc --- diff --git a/kernel/include/kq.h b/kernel/include/kq.h new file mode 100644 index 0000000..ed6604e --- /dev/null +++ b/kernel/include/kq.h @@ -0,0 +1,10 @@ +#ifndef __KQ_H +#define __KQ_H + +typedef struct _kq kq_t; + +int kq_nq(kq_t**, void*); +void* kq_dq(kq_t**); +int kq_rm(kq_t**, void*); + +#endif /* __KQ_H */ diff --git a/kernel/klibc/Makefile b/kernel/klibc/Makefile index f029acd..0b67c09 100644 --- a/kernel/klibc/Makefile +++ b/kernel/klibc/Makefile @@ -1,5 +1,6 @@ OUTPUT = klibc.a -OBJECTS = string.o spinlock.o mutex.o posixcall.o coraxcall.o heap.o stdio.o signal.o +OBJECTS = string.o spinlock.o mutex.o posixcall.o coraxcall.o heap.o stdio.o signal.o \ + kq.o PHONY = clean INCLUDES = -I../include -I../../include -I../.. CFLAGS = -m32 -Wall -nostdlib -nodefaultlibs -nostartfiles -ffreestanding $(INCLUDES) diff --git a/kernel/klibc/kq.c b/kernel/klibc/kq.c new file mode 100644 index 0000000..707778b --- /dev/null +++ b/kernel/klibc/kq.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +struct _kq { + struct _kq *next; + void *data; +}; + +int kq_nq(kq_t **q, void *data) +{ + kq_t *item; + int ret_val; + + ret_val = -ENOMEM; + item = kmalloc(sizeof(*item)); + + if(item) { + item->data = data; + item->next = NULL; + + while(*q) { + q = &((*q)->next); + } + + *q = item; + ret_val = 0; + } + + return(ret_val); +} + +void* kq_dq(kq_t **q) +{ + kq_t *cur; + void *ret_val; + + cur = *q; + ret_val = NULL; + + if(cur) { + *q = cur->next; + ret_val = cur->data; + + kfree(cur); + } + + return(ret_val); +} + +int kq_rm(kq_t **q, void *data) +{ + int ret_val; + + ret_val = -ENOENT; + + while(*q) { + if((*q)->data == data) { + kq_t *freeme; + + freeme = *q; + *q = freeme->next; + + kfree(freeme); + ret_val = 0; + break; + } + + q = &((*q)->next); + } + + return(ret_val); +}