From 19160d1e7f3bf41a6f7edbc5ec539d4588e1c69a Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 24 Sep 2012 16:53:48 +0200 Subject: [PATCH] wait for bots to be disconnected on shutdown --- src/ClientSocket.c | 4 +++- src/main.c | 34 +++++++++++++++++----------------- src/main.h | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 7160014..eb11d88 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - +#include "main.h" #include "ClientSocket.h" #include "IRCParser.h" #include "UserNode.h" @@ -222,6 +222,8 @@ static IOHANDLER_CALLBACK(socket_callback) { #ifdef HAVE_THREADS unsigned int tid; #endif + if(process_state.running == 0) + return; //just ignore the event (shutdown sequence) switch(event->type) { case IOEVENT_CONNECTED: client->flags |= SOCKET_FLAG_CONNECTED; diff --git a/src/main.c b/src/main.c index d262190..d17647d 100644 --- a/src/main.c +++ b/src/main.c @@ -47,22 +47,7 @@ #include "IOHandler.h" #include "statistics.h" -static struct { - time_t start_time; - int running : 1; - int restart : 1; - int run_as_daemon : 1; - int daemonized : 1; - int loglevel : 8; - int loaded_config : 1; - int running_threads : 8; - - int argc; - char **argv; - - char config[MAXLEN]; - char pidfile[MAXLEN]; -} process_state; +struct ProcessState process_state; static FILE *log_fptr = NULL; @@ -199,7 +184,22 @@ void initialize_subsystems() { void shutdown_subsystems() { free_sockets(1); - usleep(10000); //wait for disconnect (10ms) + //wait 50ms (run iohandler) + { + struct timeval timeout, ctime1, ctime2; + gettimeofday(&ctime1, NULL); + ctime1.tv_usec += 50000; + if(ctime1.tv_usec > 1000000) { + ctime1.tv_usec -= 1000000; + ctime1.tv_sec++; + } + do { + timeout.tv_sec = 0; + timeout.tv_usec = 10000; + iohandler_poll_timeout(timeout); + gettimeofday(&ctime2, NULL); + } while(timeval_is_bigger(ctime1, ctime2)); + } stop_modules(); free_sockets(0); qserver_free(); diff --git a/src/main.h b/src/main.h index f429b67..85e4fd8 100644 --- a/src/main.h +++ b/src/main.h @@ -18,8 +18,27 @@ #define _main_h #include "overall.h" +struct ProcessState { + time_t start_time; + int running : 1; + int restart : 1; + int run_as_daemon : 1; + int daemonized : 1; + int loglevel : 8; + int loaded_config : 1; + int running_threads : 8; + + int argc; + char **argv; + + char config[MAXLEN]; + char pidfile[MAXLEN]; +}; + #ifndef DND_FUNCTIONS +extern struct ProcessState process_state; + #ifdef HAVE_THREADS extern pthread_mutex_t cache_sync; extern pthread_mutex_t whohandler_sync, whohandler_mass_sync; -- 2.20.1