From e3760b1ec7c1a1efb658cee63a177ef0a3b48a0e Mon Sep 17 00:00:00 2001
From: Marek Vavrusa <marek@vavrusa.com>
Date: Tue, 12 Oct 2010 16:34:26 +0200
Subject: [PATCH] Disabled non-blocking sockets by default, threads signal
 notification on SIGINT.

---
 src/server/socket-manager.c | 17 +++++++++++------
 src/server/socket-manager.h |  2 +-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/server/socket-manager.c b/src/server/socket-manager.c
index ad5bf6404..20c46103d 100644
--- a/src/server/socket-manager.c
+++ b/src/server/socket-manager.c
@@ -15,6 +15,7 @@
 #include <unistd.h>
 #include <assert.h>
 #include <arpa/inet.h>
+#include <signal.h>
 
 //#define SM_DEBUG
 
@@ -196,6 +197,10 @@ int sm_start( sm_manager* manager )
 void sm_stop( sm_manager *manager )
 {
     manager->is_running = 0;
+    pthread_kill(manager->master_dpt->threads[0], SIGALRM);
+    for(int i = 0; i < manager->workers_dpt->thread_count; ++i) {
+       pthread_kill(manager->workers_dpt->threads[i], SIGALRM);
+    }
 }
 
 int sm_wait( sm_manager* manager )
@@ -245,7 +250,7 @@ int sm_open( sm_manager *manager, unsigned short port, socket_t type )
 
     // TCP needs listen
     if(type == TCP) {
-        res = listen(socket_new->socket, 5); /// \todo Tweak backlog size.
+        res = listen(socket_new->socket, 10); /// \todo Tweak backlog size.
         if (res == -1) {
             close(socket_new->socket);
             free(socket_new);
@@ -373,11 +378,11 @@ int sm_add_event( int epfd, int socket, uint32_t events )
     memset(&ev, 0, sizeof(struct epoll_event));
 
     // All polled events should use non-blocking mode.
-    int old_flag = fcntl(socket, F_GETFL, 0);
-    if (fcntl(socket, F_SETFL, old_flag | O_NONBLOCK) == -1) {
-        log_error("error setting non-blocking mode on the socket.\n");
-        return -1;
-    }
+    //int old_flag = fcntl(socket, F_GETFL, 0);
+    //if (fcntl(socket, F_SETFL, old_flag | O_NONBLOCK) == -1) {
+    //    log_error("error setting non-blocking mode on the socket.\n");
+    //    return -1;
+    //}
 
     // Register to epoll
     ev.data.fd = socket;
diff --git a/src/server/socket-manager.h b/src/server/socket-manager.h
index 4ec618e97..858039e18 100644
--- a/src/server/socket-manager.h
+++ b/src/server/socket-manager.h
@@ -64,7 +64,7 @@ typedef struct sm_worker {
   */
 typedef struct sm_manager {
     sm_socket* sockets;
-    volatile short is_running; /// \todo Implement notification via Linux eventfd() instead of is_running.
+    volatile short is_running;
     dpt_dispatcher *master_dpt;
     dpt_dispatcher *workers_dpt;
     sm_worker master;
-- 
GitLab