X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmain.c;h=7e1839f1c9ca27127ef907388c861e19c4a3ac3d;hb=db9df7a1356859ffb8dcca001317940c92a80045;hp=17980b445762e5b2b9634d94bc2c4f2d93e98c98;hpb=c32e8254ec4ed0d77757e32f8aa5aabcdb494057;p=NeonServV5.git diff --git a/src/main.c b/src/main.c index 17980b4..7e1839f 100644 --- a/src/main.c +++ b/src/main.c @@ -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(¤t_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);