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 */ +