*/
#include "main.h"
+#include "signal.h"
#include "ClientSocket.h"
#include "UserNode.h"
#include "ChanNode.h"
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;
}
#ifdef HAVE_THREADS
+pthread_t *current_threads = NULL;
+
void * thread_main(void *arg) {
time_t socket_wait;
while(running) {
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);
+
+ #ifdef ENABLE_MEMORY_DEBUG
+ initMemoryDebug();
+ #endif
start_time = time(0);
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) {
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
#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);