*** VERSION 5.5.0 ***
[NeonServV5.git] / src / timeq.c
index 41e4b1a3b1dec349c6547c191e87bd9defac812e..be82f8f6cca5bec87af1b3bd8e7d8e5b7e14e2bf 100644 (file)
@@ -1,4 +1,4 @@
-/* timeq.c - NeonServ v5.3
+/* timeq.c - NeonServ v5.5
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -37,6 +37,8 @@ void timeq_tick() {
             if(timeq_events == entry)
                 timeq_events = next;
             entry->callback(entry->data);
+            if(entry->name)
+                free(entry->name);
             free(entry);
         } else
             break;
@@ -44,11 +46,11 @@ void timeq_tick() {
     DESYNCHRONIZE(synchronized);
 }
 
-struct timeq_entry* timeq_add(int seconds, timeq_callback_t *callback, void *data) {
-    return timeq_uadd(seconds * 1000, callback, data);
+struct timeq_entry* timeq_add(int seconds, int module_id, timeq_callback_t *callback, void *data) {
+    return timeq_uadd(seconds * 1000, module_id, callback, data);
 }
 
-struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *data) {
+struct timeq_entry* timeq_uadd(int useconds, int module_id, timeq_callback_t *callback, void *data) {
     struct timeval now;
     gettimeofday(&now, NULL);
     struct timeq_entry *entry = malloc(sizeof(*entry));
@@ -61,6 +63,7 @@ struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *d
     now.tv_usec += (useconds % 1000);
     now.tv_sec += (useconds / 1000);
     entry->execute = now;
+    entry->module_id = module_id;
     entry->callback = callback;
     entry->data = data;
     entry->name = NULL;
@@ -82,13 +85,13 @@ struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *d
     return entry;
 }
 
-struct timeq_entry* timeq_add_name(char *name, int seconds, timeq_callback_t *callback, void *data) {
-    return timeq_uadd_name(name, seconds * 1000, callback, data);
+struct timeq_entry* timeq_add_name(char *name, int seconds, int module_id, timeq_callback_t *callback, void *data) {
+    return timeq_uadd_name(name, seconds * 1000, module_id, callback, data);
 }
 
-struct timeq_entry* timeq_uadd_name(char *name, int useconds, timeq_callback_t *callback, void *data) {
+struct timeq_entry* timeq_uadd_name(char *name, int useconds, int module_id, timeq_callback_t *callback, void *data) {
     SYNCHRONIZE(synchronized);
-    struct timeq_entry *entry = timeq_uadd(useconds, callback, data);
+    struct timeq_entry *entry = timeq_uadd(useconds, module_id, callback, data);
     entry->name = strdup(name);
     DESYNCHRONIZE(synchronized);
     return entry;
@@ -149,3 +152,21 @@ int timeq_name_exists(char *name) {
     DESYNCHRONIZE(synchronized);
     return 0;
 }
+
+void unregister_module_timers(int module_id) {
+    SYNCHRONIZE(synchronized);
+    struct timeq_entry *centry, *next, *last = NULL;
+    for(centry = timeq_events; centry; centry = next) {
+        next = centry->next;
+        if(centry->module_id == module_id) {
+            if(last)
+                last->next = centry->next;
+            else
+                timeq_events = centry->next;
+            free(centry->name);
+            free(centry);
+        } else
+            last = centry;
+    }
+    DESYNCHRONIZE(synchronized);
+}