X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmain.c;h=e8d366aa0d7141696c51b302cc900f2b961fa3c2;hb=82f0cd1f3c2c0160944b0c627581f1994583e2b2;hp=876dc70be79891645b6edfa6050b8cf84302c273;hpb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;p=NeonServV5.git diff --git a/src/main.c b/src/main.c index 876dc70..e8d366a 100644 --- a/src/main.c +++ b/src/main.c @@ -36,15 +36,22 @@ #include "commands.h" #include "ConfigParser.h" #include "ssl.h" +#include "QServer.h" time_t start_time; static int running, hard_restart; static int statistics_requested_lusers = 0; int statistics_enabled; TIMEQ_CALLBACK(main_statistics); +#ifdef HAVE_THREADS +int running_threads; +pthread_mutex_t cache_sync; +pthread_mutex_t whohandler_sync, whohandler_mass_sync; +#endif void cleanup() { free_sockets(); + qserver_free(); free_parser(); free_UserNode(); free_ChanNode(); @@ -92,6 +99,22 @@ static int load_mysql_config() { return 1; } +#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); + clearTempUsers(); + destroyEvents(); + } + running_threads--; + return NULL; +} +#endif + int main(int argc, char *argv[]) { main: @@ -113,7 +136,15 @@ main: statistics_enabled = get_int_field("statistics.enable"); + #ifdef HAVE_THREADS + THREAD_MUTEX_INIT(cache_sync); + THREAD_MUTEX_INIT(whohandler_sync); + THREAD_MUTEX_INIT(whohandler_mass_sync); + #endif + queue_init(); + init_sockets(); + init_timeq(); init_lang(); ssl_init(); init_parser(); @@ -127,14 +158,38 @@ main: register_commands(); init_bots(); init_DBHelper(); + qserver_init(); load_languages(); int update_minutes = get_int_field("statistics.frequency"); 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++) { + running_threads++; + pthread_create(&tid[tid_id], NULL, thread_main, NULL); + } + int usleep_delay = 1000000 / TICKS_PER_SECOND; + while(running) { + timeq_tick(); + loop_bots(); + qserver_loop(); + queue_loop(); + usleep(usleep_delay); + } + for(tid_id = 0; tid_id < worker_threads; tid_id++) { + pthread_join(tid[tid_id], NULL); + } + running_threads = 0; + #else + time_t socket_wait; while(running) { socket_wait = time(0) + SOCKET_SELECT_TIME; do { @@ -144,8 +199,10 @@ main: loop_bots(); clearTempUsers(); destroyEvents(); + qserver_loop(); queue_loop(); } + #endif cleanup(); if(hard_restart) { /* Append a NULL to the end of argv[]. */