added some code & compiler information to cmd_netinfo
[NeonServV5.git] / timeq.c
1
2 #include "timeq.h"
3
4 static struct timeq_entry *timeq_events;
5
6 void timeq_tick() {
7     struct timeq_entry *entry, *next;
8     time_t now = time(0);
9     for(entry = timeq_events; entry; entry = next) {
10         if(entry->execute <= now) {
11             entry->callback(entry->data);
12             next = entry->next;
13             free(entry);
14         } else
15             break;
16     }
17 }
18
19 struct timeq_entry* timeq_add(int seconds, timeq_callback_t *callback, void *data) {
20     time_t now = time(0);
21     struct timeq_entry *entry = malloc(sizeof(*entry));
22     if (!entry)
23     {
24         perror("malloc() failed");
25         return NULL;
26     }
27     entry->execute = now + seconds;
28     entry->callback = callback;
29     entry->data = data;
30     struct timeq_entry *next, *prev = NULL;
31     for(next = timeq_events; next; next = next->next) {
32         if(next->execute >= entry->execute)
33             break;
34         else
35             prev = next;
36     }
37     if(prev == NULL) {
38         entry->next = timeq_events;
39         timeq_events = entry;
40     } else {
41         entry->next = next;
42         prev->next = entry;
43     }
44     return entry;
45 }
46
47 int timeq_del(struct timeq_entry* entry) {
48     struct timeq_entry *centry, *last = NULL;
49     for(centry = timeq_events; centry; centry = centry->next) {
50         if(centry == entry) {
51             if(last)
52                 last->next = centry->next;
53             else
54                 timeq_events = centry->next;
55             free(centry);
56             return 1;
57         } else {
58             last = centry;
59         }
60     }
61     return 0;
62 }