X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2Fmain.c;h=60b7ec6ac4b37fb9e1f5f08f95ea29a0c02b176b;hp=1728d00aeac1b47b0a947b7fcd6790a40fec6b8d;hb=55831bf424312a6908ca07a904f288fba0919a9a;hpb=003f6906aeb911cce26ee25b48a818d0d1c4aea5 diff --git a/src/main.c b/src/main.c index 1728d00..60b7ec6 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ -/* main.c - NeonServ v5.2 - * Copyright (C) 2011 Philipp Kreil (pk910) +/* main.c - NeonServ v5.3 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,7 +38,7 @@ #include "ssl.h" time_t start_time; -static int running; +static int running, hard_restart; static int statistics_requested_lusers = 0; int statistics_enabled; TIMEQ_CALLBACK(main_statistics); @@ -92,7 +92,25 @@ static int load_mysql_config() { return 1; } -int main(void) { +#ifdef HAVE_THREADS +void * thread_main(void *arg) { + time_t socket_wait; + while(running) { + socket_wait = time(0) + SOCKET_SELECT_TIME; + do { + socket_loop(SOCKET_SELECT_TIME); + } while(time(0) < socket_wait); + timeq_tick(); + loop_bots(); + clearTempUsers(); + destroyEvents(); + queue_loop(); + } + return NULL; +} +#endif + +int main(int argc, char *argv[]) { main: start_time = time(0); @@ -114,6 +132,7 @@ main: statistics_enabled = get_int_field("statistics.enable"); queue_init(); + init_timeq(); init_lang(); ssl_init(); init_parser(); @@ -133,8 +152,21 @@ main: if(!update_minutes) update_minutes = 2; timeq_add(update_minutes * 60 + 10, main_statistics, NULL); - time_t socket_wait; + 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; + for(tid_id = 0; tid_id < worker_threads; tid_id++) { + pthread_create(&tid[tid_id], NULL, thread_main, NULL); + } + for(tid_id = 0; tid_id < worker_threads; tid_id++) { + pthread_join(tid[tid_id], NULL); + } + #else + time_t socket_wait; while(running) { socket_wait = time(0) + SOCKET_SELECT_TIME; do { @@ -146,7 +178,20 @@ main: destroyEvents(); queue_loop(); } + #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 + } goto main; } @@ -179,7 +224,8 @@ int stricmplen (const char *s1, const char *s2, int len) return c1 - c2; } -void restart_bot(int hard_restart) { +void restart_bot(int do_hard_restart) { + hard_restart = do_hard_restart; running = 0; }