Merge branch 'development'
[NeonServV5.git] / src / timeq.c
index 335032519f52a837b01c9f5e58bce5cc88face4e..ec9ea3e4017803440e5c5c63637e9b8aaa7ffbab 100644 (file)
@@ -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,8 @@
 
 #include "timeq.h"
 #include "IOHandler.h"
+#include "tools.h"
+#include "log.h"
 
 static struct timeq_entry *timeq_events;
 #ifdef HAVE_THREADS
@@ -28,7 +30,12 @@ static IOHANDLER_CALLBACK(timeq_callback) {
     struct timeq_entry *entry = event->iofd->data;
     switch(event->type) {
     case IOEVENT_TIMEOUT:
+        if(entry->name) {
+            free(entry->name);
+            entry->name = NULL;
+        }
         entry->callback(entry->data);
+        entry->iofd = NULL;
         timeq_del(entry);
         break;
     default:
@@ -45,13 +52,15 @@ struct timeq_entry* timeq_uadd(int useconds, int module_id, timeq_callback_t *ca
     struct timeq_entry *entry = malloc(sizeof(*entry));
     if (!entry)
     {
-        perror("malloc() failed");
+        printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
         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);
@@ -82,7 +91,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;
@@ -92,7 +103,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;