From 144e697f9fa898814b8e6a2f53d6f74bbb931fde Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 21 May 2010 14:53:58 +0000 Subject: [PATCH] * Change to main server loop. All threads block on accept() instead of using a mutex. Hopefully this will solve the deadlock issue that has been plaguing us. --- webcit/sysdep.c | 33 +++++++-------------------------- webcit/tcp_sockets.c | 7 ------- webcit/webcit.h | 1 - 3 files changed, 7 insertions(+), 34 deletions(-) diff --git a/webcit/sysdep.c b/webcit/sysdep.c index 00fafbbed..afaef1a1d 100644 --- a/webcit/sysdep.c +++ b/webcit/sysdep.c @@ -143,18 +143,11 @@ void worker_entry(void) int ssock; int i = 0; int fail_this_transaction = 0; - int ret; - struct timeval tv; - fd_set readset, tempset; ParsedHttpHdrs Hdr; memset(&Hdr, 0, sizeof(ParsedHttpHdrs)); Hdr.HR.eReqType = eGET; http_new_modules(&Hdr); - tv.tv_sec = 0; - tv.tv_usec = 10000; - FD_ZERO(&readset); - FD_SET(msock, &readset); do { /* Only one thread can accept at a time */ @@ -162,25 +155,13 @@ void worker_entry(void) ssock = -1; errno = EAGAIN; do { - ret = -1; /* just one at once should select... */ - begin_critical_section(S_SELECT); - - FD_ZERO(&tempset); - if (msock > 0) FD_SET(msock, &tempset); - tv.tv_sec = 0; - tv.tv_usec = 10000; - if (msock > 0) ret = select(msock+1, &tempset, NULL, NULL, &tv); - end_critical_section(S_SELECT); - if ((ret < 0) && (errno != EINTR) && (errno != EAGAIN)) - {/* EINTR and EAGAIN are thrown but not of interest. */ - lprintf(2, "accept() failed:%d %s\n", - errno, strerror(errno)); - } - else if ((ret > 0) && (msock > 0) && FD_ISSET(msock, &tempset)) - {/* Successfully selected, and still not shutting down? Accept! */ - ssock = accept(msock, NULL, 0); - } - + ssock = accept(msock, NULL, 0); + lprintf(9, "\033[3%dmthread %u woke up, accept() returned %d %s\033[0m\n", + ((pthread_self() % 6) + 1), + pthread_self(), + ssock, + ((ssock >= 0) ? "" : strerror(errno)) + ); } while ((msock > 0) && (ssock < 0) && (time_to_die == 0)); if ((msock == -1)||(time_to_die)) diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 1fef41737..b4197e5d9 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -653,13 +653,6 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) i = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); - #ifndef __APPLE__ - fcntl(s, F_SETFL, O_NONBLOCK); /* maide: this statement is incorrect - there should be a preceding F_GETFL - and a bitwise OR with the previous - fd flags */ - #endif - if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) { lprintf(1, "Can't bind: %s\n", strerror(errno)); return (-WC_EXIT_BIND); diff --git a/webcit/webcit.h b/webcit/webcit.h index 91feac91b..b8f0d4e12 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -587,7 +587,6 @@ void RegisterHeaderHandler(const char *Name, long Len, Header_Evaluator F); enum { - S_SELECT, S_SHUTDOWN, MAX_SEMAPHORES }; -- 2.30.2