diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk
index 1d674ab..94cfe92 100644
--- a/nbproject/Makefile-Debug.mk
+++ b/nbproject/Makefile-Debug.mk
@@ -43,6 +43,7 @@ OBJECTFILES= \
${OBJECTDIR}/src/http.o \
${OBJECTDIR}/src/main.o \
${OBJECTDIR}/src/mime.o \
+ ${OBJECTDIR}/src/queue.o \
${OBJECTDIR}/src/socket.o \
${OBJECTDIR}/src/util.o
@@ -61,7 +62,7 @@ FFLAGS=
ASFLAGS=
# Link Libraries and Options
-LDLIBSOPTIONS=-lmagic
+LDLIBSOPTIONS=-lmagic -lpthread
# Build Targets
.build-conf: ${BUILD_SUBPROJECTS}
@@ -111,6 +112,11 @@ ${OBJECTDIR}/src/mime.o: nbproject/Makefile-${CND_CONF}.mk src/mime.c
${RM} "$@.d"
$(COMPILE.c) -g -Werror -DINI_ALLOW_BOM=0 -DINI_ALLOW_MULTILINE=0 -D_GNU_SOURCE -Ilib -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/mime.o src/mime.c
+${OBJECTDIR}/src/queue.o: nbproject/Makefile-${CND_CONF}.mk src/queue.c
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} "$@.d"
+ $(COMPILE.c) -g -Werror -DINI_ALLOW_BOM=0 -DINI_ALLOW_MULTILINE=0 -D_GNU_SOURCE -Ilib -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/queue.o src/queue.c
+
${OBJECTDIR}/src/socket.o: nbproject/Makefile-${CND_CONF}.mk src/socket.c
${MKDIR} -p ${OBJECTDIR}/src
${RM} "$@.d"
diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk
index 4a7c552..5ba0cec 100644
--- a/nbproject/Makefile-Release.mk
+++ b/nbproject/Makefile-Release.mk
@@ -43,6 +43,7 @@ OBJECTFILES= \
${OBJECTDIR}/src/http.o \
${OBJECTDIR}/src/main.o \
${OBJECTDIR}/src/mime.o \
+ ${OBJECTDIR}/src/queue.o \
${OBJECTDIR}/src/socket.o \
${OBJECTDIR}/src/util.o
@@ -61,7 +62,7 @@ FFLAGS=
ASFLAGS=
# Link Libraries and Options
-LDLIBSOPTIONS=-lmagic
+LDLIBSOPTIONS=-lmagic -lpthread
# Build Targets
.build-conf: ${BUILD_SUBPROJECTS}
@@ -111,6 +112,11 @@ ${OBJECTDIR}/src/mime.o: nbproject/Makefile-${CND_CONF}.mk src/mime.c
${RM} "$@.d"
$(COMPILE.c) -O2 -Werror -DINI_ALLOW_BOM=0 -DINI_ALLOW_MULTILINE=0 -D_GNU_SOURCE -Ilib -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/mime.o src/mime.c
+${OBJECTDIR}/src/queue.o: nbproject/Makefile-${CND_CONF}.mk src/queue.c
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} "$@.d"
+ $(COMPILE.c) -O2 -Werror -DINI_ALLOW_BOM=0 -DINI_ALLOW_MULTILINE=0 -D_GNU_SOURCE -Ilib -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/queue.o src/queue.c
+
${OBJECTDIR}/src/socket.o: nbproject/Makefile-${CND_CONF}.mk src/socket.c
${MKDIR} -p ${OBJECTDIR}/src
${RM} "$@.d"
diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml
index a6563b1..503c786 100644
--- a/nbproject/configurations.xml
+++ b/nbproject/configurations.xml
@@ -12,6 +12,7 @@
lib/ini.h
src/main.h
src/mime.h
+ src/queue.h
src/socket.h
src/util.h
@@ -30,6 +31,7 @@
lib/ini.c
src/main.c
src/mime.c
+ src/queue.c
src/socket.c
src/util.c
@@ -75,6 +77,7 @@
magic
+ PosixThreads
@@ -118,6 +121,10 @@
-
+ -
+
+ -
+
-
-
@@ -152,6 +159,7 @@
magic
+ PosixThreads
@@ -195,6 +203,10 @@
-
+ -
+
+ -
+
-
-
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
index d97b1b3..7cd6f01 100644
--- a/nbproject/private/private.xml
+++ b/nbproject/private/private.xml
@@ -8,20 +8,11 @@
file:/home/sam/NetBeansProjects/KHttp/src/socket.c
+ file:/home/sam/NetBeansProjects/KHttp/src/util.h
file:/home/sam/NetBeansProjects/KHttp/src/config.c
- file:/home/sam/NetBeansProjects/KHttp/content/dirindex.html
- file:/home/sam/NetBeansProjects/KHttp/src/http-server.h
- file:/home/sam/NetBeansProjects/KHttp/src/http.c
- file:/home/sam/NetBeansProjects/KHttp/lib/ut/utstring.h
file:/home/sam/NetBeansProjects/KHttp/src/main.h
- file:/home/sam/NetBeansProjects/KHttp/lib/http_parser.h
- file:/home/sam/NetBeansProjects/KHttp/Makefile
file:/home/sam/NetBeansProjects/KHttp/src/main.c
- file:/home/sam/NetBeansProjects/KHttp/src/socket.h
- file:/home/sam/NetBeansProjects/KHttp/src/http-server.c
- file:/home/sam/NetBeansProjects/KHttp/lib/ini.c
- file:/home/sam/NetBeansProjects/KHttp/src/http.h
- file:/home/sam/NetBeansProjects/KHttp/src/config.h
+ file:/home/sam/NetBeansProjects/KHttp/src/util.c
diff --git a/src/main.c b/src/main.c
index 8c50a53..7033f42 100644
--- a/src/main.c
+++ b/src/main.c
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include "http_parser.h"
@@ -27,6 +28,7 @@
#include "config.h"
#include "http-server.h"
#include "mime.h"
+#include "queue.h"
int serverfd = 0;
volatile static bool stop = false;
diff --git a/src/queue.c b/src/queue.c
new file mode 100644
index 0000000..d4c450c
--- /dev/null
+++ b/src/queue.c
@@ -0,0 +1,78 @@
+#include
+#include
+#include
+
+#include "queue.h"
+#include "util.h"
+#include "ut/utlist.h"
+
+queue_item* queue_item_new() {
+ queue_item *item = calloc(1, sizeof(queue_item));
+ return item;
+}
+void queue_item_delete(queue_item *item) {
+ free(item);
+}
+
+queue* queue_new() {
+ queue *q = calloc(1, sizeof(queue));
+ q->count = 0;
+ q->list = NULL;
+ q->mutex = calloc(1, sizeof(pthread_mutex_t));
+ if (pthread_mutex_init(q->mutex, NULL) != 0) {
+ fatal("Failed to init queue mutex");
+ }
+ q->cond = calloc(1, sizeof(pthread_cond_t));
+ if (pthread_cond_init(q->cond, NULL) != 0) {
+ fatal("Failed to init queue cond");
+ }
+
+ return q;
+}
+void queue_delete(queue *q) {
+ queue_item *elem, *tmp;
+ DL_FOREACH_SAFE(q->list, elem, tmp) {
+ queue_item_delete(elem);
+ DL_DELETE(q->list, elem);
+ }
+ pthread_mutex_destroy(q->mutex);
+ free(q->mutex);
+ pthread_cond_destroy(q->cond);
+ free(q->cond);
+ free(q);
+}
+int queue_add(queue *q, queue_item *item) {
+ QUEUE_LOCK(q);
+ DL_APPEND(q->list, item);
+ q->count++;
+ pthread_cond_signal(q->cond);
+ QUEUE_UNLOCK(q);
+ return 0;
+}
+int queue_remove(queue *q, queue_item *item) {
+ QUEUE_LOCK(q);
+ queue_item *elem, *tmp;
+ DL_FOREACH_SAFE(q->list, elem, tmp) {
+ if (elem == item) {
+ DL_DELETE(q->list, elem);
+ queue_item_delete(elem);
+ break;
+ }
+ }
+ q->count--;
+ QUEUE_UNLOCK(q);
+}
+queue_item* queue_fetchone(queue *q, bool blocking) {
+ queue_item *item = NULL;
+ QUEUE_LOCK(q);
+ if (q->count == 0 && blocking == true) {
+ pthread_cond_wait(q->cond, q->mutex);
+ }
+ if (q->count > 0) {
+ item = q->list;
+ DL_DELETE(q->list, q->list);
+ q->count--;
+ }
+ QUEUE_UNLOCK(q);
+ return item;
+}
\ No newline at end of file
diff --git a/src/queue.h b/src/queue.h
new file mode 100644
index 0000000..eaa8aeb
--- /dev/null
+++ b/src/queue.h
@@ -0,0 +1,60 @@
+/*
+ * File: queue.h
+ * Author: sam
+ *
+ * Created on 04 August 2014, 14:27
+ */
+
+#ifndef QUEUE_H
+#define QUEUE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+#include
+#include
+
+ typedef struct queue_item {
+ struct queue_item *prev;
+ struct queue_item *next;
+ char tag[16];
+ void *data;
+ } queue_item;
+
+ queue_item* queue_item_new();
+ void queue_item_delete(queue_item *item);
+
+ typedef struct queue {
+ queue_item *list;
+ uint64_t count;
+ pthread_mutex_t *mutex;
+ pthread_cond_t *cond;
+ } queue;
+
+#define QUEUE_LOCK(q) \
+ do { \
+ if (pthread_mutex_lock(q->mutex)!=0) { \
+ fatal("Could not lock queue"); \
+ } \
+ } while(0)
+#define QUEUE_UNLOCK(q) \
+ do { \
+ if (pthread_mutex_unlock(q->mutex)!=0) {\
+ fatal("Could not unlock queue"); \
+ } \
+ } while(0)
+
+ queue* queue_new();
+ void queue_delete(queue *q);
+ int queue_add(queue *q, queue_item *item);
+ int queue_remove(queue *q, queue_item *item);
+ queue_item* queue_fetchone(queue *q, bool blocking);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* QUEUE_H */
+