From be001fb17ae4f1e125d93553c27b1b729256ba1e Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Wed, 24 Aug 2022 10:06:14 -0400 Subject: [PATCH] Make HttpServer utilize Queue. --- src/HttpServer.c | 63 ++++++++++++++++++++++++++++++++++++++++++++- src/Queue.c | 20 ++++++++------ src/include/Queue.h | 2 ++ 3 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/HttpServer.c b/src/HttpServer.c index 2e0c83b..b136cc2 100644 --- a/src/HttpServer.c +++ b/src/HttpServer.c @@ -24,8 +24,10 @@ #include #include +#include #include +#include #include #include #include @@ -47,8 +49,52 @@ struct HttpServer HttpHandler *requestHandler; void *handlerArgs; + + Queue *connQueue; + pthread_mutex_t connQueueMutex; }; +static int +QueueConnection(HttpServer * server, int fd) +{ + FILE *fp; + int result; + + if (!server) + { + return 0; + } + + fp = fdopen(fd, "rw"); + if (!fp) + { + return 0; + } + + pthread_mutex_lock(&server->connQueueMutex); + result = QueuePush(server->connQueue, fp); + pthread_mutex_unlock(&server->connQueueMutex); + + return result; +} + +static FILE * +DequeueConnection(HttpServer * server) +{ + FILE *fp; + + if (!server) + { + return NULL; + } + + pthread_mutex_lock(&server->connQueueMutex); + fp = QueuePop(server->connQueue); + pthread_mutex_unlock(&server->connQueueMutex); + + return fp; +} + HttpServer * HttpServerCreate(unsigned short port, unsigned int nThreads, unsigned int maxConnections, HttpHandler * requestHandler, void *handlerArgs) @@ -67,6 +113,13 @@ HttpServerCreate(unsigned short port, unsigned int nThreads, unsigned int maxCon return NULL; } + server->connQueue = QueueCreate(maxConnections); + if (!server->connQueue) + { + free(server); + return NULL; + } + server->sd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); if (server->sd < 0) @@ -120,6 +173,7 @@ HttpServerEventThread(void *args) { HttpServer *server = (HttpServer *) args; struct pollfd pollFds[1]; + FILE *fp; server->isRunning = 1; server->stop = 0; @@ -147,7 +201,14 @@ HttpServerEventThread(void *args) continue; } - close(connFd); + QueueConnection(server, connFd); + } + + /* Wait on all threads in the thread pool */ + + while ((fp = DequeueConnection(server))) + { + fclose(fp); } server->isRunning = 0; diff --git a/src/Queue.c b/src/Queue.c index db40faa..5500b3a 100644 --- a/src/Queue.c +++ b/src/Queue.c @@ -23,12 +23,14 @@ */ #include +#include + struct Queue { void **items; size_t size; - int front; - int rear; + size_t front; + size_t rear; }; Queue * @@ -56,8 +58,10 @@ QueueCreate(size_t size) } q->size = size; - q->front = -1; - q->rear = -1; + q->front = size + 1; + q->rear = size + 1; + + return q; } void @@ -72,7 +76,7 @@ QueueFree(Queue * q) } int -QueueFull(Queue *) +QueueFull(Queue * q) { if (!q) { @@ -83,14 +87,14 @@ QueueFull(Queue *) } int -QueueEmpty(Queue *) +QueueEmpty(Queue * q) { if (!q) { return 0; } - return q->front == -1; + return q->front == q->size + 1; } int @@ -106,7 +110,7 @@ QueuePush(Queue * q, void *element) return 0; } - if (q->front == -1) + if (q->front == q->size + 1) { q->front = 0; } diff --git a/src/include/Queue.h b/src/include/Queue.h index a67b437..afafdec 100644 --- a/src/include/Queue.h +++ b/src/include/Queue.h @@ -24,6 +24,8 @@ #ifndef TELODENDRIA_QUEUE_H #define TELODENDRIA_QUEUE_H +#include + typedef struct Queue Queue; extern Queue *