X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2Ftimeq.c;h=c95068ddaf0ea128c4ff108f4ee07fc5a703c975;hp=b53b58ddd25689d91674d75537e6bcb25c289560;hb=88751acefe20e568fc945d7e5f5c11e0a9c7be60;hpb=c99b8d5951fe6429844c8cb5ff94213bb625ad95 diff --git a/src/timeq.c b/src/timeq.c index b53b58d..c95068d 100644 --- a/src/timeq.c +++ b/src/timeq.c @@ -1,4 +1,4 @@ -/* timeq.c - NeonServ v5.5 +/* timeq.c - NeonServ v5.6 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -17,6 +17,7 @@ #include "timeq.h" #include "IOHandler.h" +#include "tools.h" static struct timeq_entry *timeq_events; #ifdef HAVE_THREADS @@ -29,6 +30,7 @@ static IOHANDLER_CALLBACK(timeq_callback) { switch(event->type) { case IOEVENT_TIMEOUT: entry->callback(entry->data); + entry->iofd = NULL; timeq_del(entry); break; default: @@ -48,10 +50,12 @@ struct timeq_entry* timeq_uadd(int useconds, int module_id, timeq_callback_t *ca perror("malloc() failed"); return NULL; } + #ifdef HAVE_THREADS if(!pthread_mutex_initialized) { THREAD_MUTEX_INIT(synchronized); pthread_mutex_initialized = 1; } + #endif gettimeofday(&timeout, NULL); SYNCHRONIZE(synchronized); timeout.tv_usec += (useconds % 1000); @@ -64,7 +68,8 @@ struct timeq_entry* timeq_uadd(int useconds, int module_id, timeq_callback_t *ca entry->name = NULL; entry->next = timeq_events; entry->prev = NULL; - timeq_events->prev = entry; + if(timeq_events) + timeq_events->prev = entry; timeq_events = entry; DESYNCHRONIZE(synchronized); return entry; @@ -81,7 +86,9 @@ struct timeq_entry* timeq_uadd_name(char *name, int useconds, int module_id, tim } int timeq_del(struct timeq_entry* entry) { + #ifdef HAVE_THREADS if(!pthread_mutex_initialized) return 0; + #endif SYNCHRONIZE(synchronized); if(entry->next) entry->next->prev = entry->prev; @@ -91,7 +98,8 @@ int timeq_del(struct timeq_entry* entry) { timeq_events = entry->next; if(entry->name) free(entry->name); - iohandler_close(entry->iofd); + if(entry->iofd) + iohandler_close(entry->iofd); free(entry); DESYNCHRONIZE(synchronized); return 1;