added signal handler
[NeonServV5.git] / src / main.c
index 17980b445762e5b2b9634d94bc2c4f2d93e98c98..7e1839f1c9ca27127ef907388c861e19c4a3ac3d 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include "main.h"
+#include "signal.h"
 #include "ClientSocket.h"
 #include "UserNode.h"
 #include "ChanNode.h"
@@ -44,6 +45,8 @@ static int statistics_requested_lusers = 0;
 int statistics_enabled;
 TIMEQ_CALLBACK(main_statistics);
 TIMEQ_CALLBACK(main_checkauths);
+static int process_argc;
+static char **process_argv;
 #ifdef HAVE_THREADS
 int running_threads;
 pthread_mutex_t cache_sync;
@@ -101,6 +104,8 @@ static int load_mysql_config() {
 }
 
 #ifdef HAVE_THREADS
+pthread_t *current_threads = NULL;
+
 void * thread_main(void *arg) {
     time_t socket_wait;
     while(running) {
@@ -114,10 +119,35 @@ void * thread_main(void *arg) {
     running_threads--;
     return NULL;
 }
+
+int getCurrentThreadID() {
+    if(!current_threads) return 0;
+    int i;
+    unsigned int my_tid = (unsigned int) pthread_self_tid();
+    for(i = 0; i < running_threads; i++) {
+        #ifdef WIN32
+        if((unsigned int) current_threads[i].p == my_tid)
+        #else
+        if((unsigned int) current_threads[i] == my_tid)
+        #endif
+            return i+1;
+    }
+    return 0;
+}
+
 #endif
 
 int main(int argc, char *argv[]) {
 main:
+    process_argv = argv;
+    process_argc = argc;
+    
+    signal(SIGABRT, sighandler);
+    signal(SIGFPE, sighandler);
+    signal(SIGILL, sighandler);
+    signal(SIGINT, sighandler);
+    signal(SIGSEGV, sighandler);
+    signal(SIGTERM, sighandler);
     
     start_time = time(0);
     
@@ -170,14 +200,13 @@ main:
     
     int worker_threads = get_int_field("General.worker_threads");
     if(!worker_threads) worker_threads = 1;
-    
     running = 1;
     #ifdef HAVE_THREADS
-    pthread_t tid[worker_threads];
     int tid_id = 0;
+    current_threads = calloc(worker_threads, sizeof(*current_threads));
     for(tid_id = 0; tid_id < worker_threads; tid_id++) {
         running_threads++;
-        pthread_create(&tid[tid_id], NULL, thread_main, NULL);
+        pthread_create(&current_threads[tid_id], NULL, thread_main, NULL);
     }
     int usleep_delay = 1000000 / TICKS_PER_SECOND;
     while(running) {
@@ -188,7 +217,7 @@ main:
         usleep(usleep_delay);
     }
     for(tid_id = 0; tid_id < worker_threads; tid_id++) {
-        pthread_join(tid[tid_id], NULL);
+        pthread_join(current_threads[tid_id], NULL);
     }
     running_threads = 0;
     #else
@@ -208,20 +237,23 @@ main:
     #endif
     cleanup();
     if(hard_restart) {
-        /* Append a NULL to the end of argv[]. */
-        char **restart_argv = (char **)alloca((argc + 1) * sizeof(char *));
-        memcpy(restart_argv, argv, argc * sizeof(char *));
-        restart_argv[argc] = NULL;
-        
-        #ifdef WIN32
-        execv(argv[0], (const char * const*)restart_argv);
-        #else
-        execv(argv[0], restart_argv);
-        #endif
+        restart_process();
     }
     goto main;
 }
 
+void restart_process() {
+    /* Append a NULL to the end of argv[]. */
+    char **restart_argv = (char **)alloca((process_argc + 1) * sizeof(char *));
+    memcpy(restart_argv, process_argv, process_argc * sizeof(char *));
+    restart_argv[process_argc] = NULL;
+    #ifdef WIN32
+    execv(process_argv[0], (const char * const*)restart_argv);
+    #else
+    execv(process_argv[0], restart_argv);
+    #endif
+}
+
 int stricmp (const char *s1, const char *s2)
 {
    if (s1 == NULL) return s2 == NULL ? 0 : -(*s2);