]> git.corax.cc Git - corax/commitdiff
Add simple kernel queue implementation to klibc
authorMatthias Kruk <m@m10k.eu>
Mon, 3 Feb 2020 22:31:16 +0000 (07:31 +0900)
committerMatthias Kruk <m@m10k.eu>
Mon, 3 Feb 2020 22:31:16 +0000 (07:31 +0900)
kernel/include/kq.h [new file with mode: 0644]
kernel/klibc/Makefile
kernel/klibc/kq.c [new file with mode: 0644]

diff --git a/kernel/include/kq.h b/kernel/include/kq.h
new file mode 100644 (file)
index 0000000..ed6604e
--- /dev/null
@@ -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 */
index f029acd26be81dd75e5b3cda91fb86aabd052534..0b67c09ef7549bb59a51e67ad7eb2f2a89f15582 100644 (file)
@@ -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 (file)
index 0000000..707778b
--- /dev/null
@@ -0,0 +1,75 @@
+#include <config.h>
+#include <corax/types.h>
+#include <corax/heap.h>
+#include <corax/errno.h>
+#include <kq.h>
+
+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);
+}