--- /dev/null
+#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 */
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)
--- /dev/null
+#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);
+}