From 90a74c3b0ab2d0f5d14255619809d24637109e07 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Mon, 9 Jan 2023 17:44:12 +0000 Subject: [PATCH] Don't accept connections if the connection queue is full. --- src/HttpServer.c | 53 ++++++++++++++++++++++-------------------------- tools/bin/td | 6 +++++- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/HttpServer.c b/src/HttpServer.c index efcbc89..149ff82 100644 --- a/src/HttpServer.c +++ b/src/HttpServer.c @@ -276,30 +276,6 @@ HttpSendHeaders(HttpServerContext * c) fprintf(fp, "\n"); } -static int -QueueConnection(HttpServer * server, int fd) -{ - FILE *fp; - int result; - - if (!server) - { - return 0; - } - - fp = fdopen(fd, "r+"); - 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) { @@ -699,6 +675,7 @@ HttpServerEventThread(void *args) int connFd; int pollResult; + pollResult = poll(pollFds, 1, 500); if (pollResult < 0) @@ -707,14 +684,32 @@ HttpServerEventThread(void *args) continue; } - connFd = accept(server->sd, (struct sockaddr *) & addr, &addrLen); + pthread_mutex_lock(&server->connQueueMutex); - if (connFd < 0) + /* Don't even accept connections if the queue is full. */ + if (!QueueFull(server->connQueue)) { - continue; - } + FILE *fp; - QueueConnection(server, connFd); + connFd = accept(server->sd, (struct sockaddr *) & addr, &addrLen); + + if (connFd < 0) + { + pthread_mutex_unlock(&server->connQueueMutex); + continue; + } + + fp = fdopen(connFd, "r+"); + if (!fp) + { + pthread_mutex_unlock(&server->connQueueMutex); + close(connFd); + continue; + } + + QueuePush(server->connQueue, fp); + } + pthread_mutex_unlock(&server->connQueueMutex); } for (i = 0; i < server->nThreads; i++) diff --git a/tools/bin/td b/tools/bin/td index a3be68d..30903a6 100644 --- a/tools/bin/td +++ b/tools/bin/td @@ -108,7 +108,11 @@ recipe_build() { done if [ $do_rebuild -eq 1 ] || [ ! -f "../build/$PROG" ]; then - echo "LD $PROG" + if [ -t 1 ]; then + printf "LD %s%*c\n" "$PROG" "16" " " + else + echo "LD $PROG" + fi $CC $LDFLAGS -o "../build/$PROG" $objs else echo "Up to date."