Sat, 03 Mar 2001 00:26:04 +0000
[gaim-migrate @ 1535]
icqlib updates. beginnings of system logging.
| 1498 | 1 | /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
| 2 | ||
| 3 | #include "timeout.h" | |
| 4 | ||
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
5 | icq_Timeout *icq_CurrentTimeout = NULL; |
| 1498 | 6 | list *icq_TimeoutList = NULL; |
| 7 | ||
| 8 | void (*icq_SetTimeout)(long length); | |
| 9 | ||
| 10 | int icq_TimeoutCompare(icq_Timeout *t1, icq_Timeout *t2) | |
| 11 | { | |
| 12 | return (t1->expire_time - t2->expire_time); | |
| 13 | } | |
| 14 | ||
| 15 | icq_Timeout *icq_TimeoutNew(int length, icq_TimeoutHandler handler, | |
| 16 | void *data) | |
| 17 | { | |
| 18 | icq_Timeout *t = (icq_Timeout *)malloc(sizeof(icq_Timeout)); | |
| 19 | ||
| 20 | if (t) | |
| 21 | { | |
| 22 | int count = icq_TimeoutList->count; | |
| 23 | ||
| 24 | t->length = length; | |
| 25 | t->handler = handler; | |
| 26 | t->data = data; | |
| 27 | t->expire_time = time(NULL) + length; | |
| 28 | t->single_shot = 1; | |
| 29 | ||
| 30 | list_insert_sorted(icq_TimeoutList, t); | |
| 31 | ||
| 32 | if (count == 0) | |
| 33 | icq_TimeoutDoNotify(); | |
| 34 | } | |
| 35 | ||
| 36 | return t; | |
| 37 | } | |
| 38 | ||
| 39 | void icq_TimeoutDelete(icq_Timeout *timeout) | |
| 40 | { | |
| 41 | list_remove(icq_TimeoutList, timeout); | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
42 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
43 | /* if this was the timeout we were currently waiting on, move on |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
44 | * to the next */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
45 | if (icq_CurrentTimeout = timeout) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
46 | { |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
47 | icq_CurrentTimeout = NULL; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
48 | icq_TimeoutDoNotify(); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
49 | } |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
50 | |
| 1498 | 51 | free(timeout); |
| 52 | } | |
| 53 | ||
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
54 | int _icq_HandleTimeout1(void *p, va_list data) |
| 1498 | 55 | { |
| 56 | icq_Timeout *t = p; | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
57 | int complete = 0; |
| 1498 | 58 | time_t current_time = va_arg(data, time_t); |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
59 | list *expired_timeouts = va_arg(data, list *); |
| 1498 | 60 | |
| 61 | if (t->expire_time <= current_time) | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
62 | list_enqueue(expired_timeouts, t); |
| 1498 | 63 | else |
| 64 | /* traversal is complete when we reach an expire time in the future */ | |
| 65 | complete = 1; | |
| 66 | ||
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
67 | return complete; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
68 | } |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
69 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
70 | int _icq_HandleTimeout2(void *p, va_list data) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
71 | { |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
72 | icq_Timeout *t = p; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
73 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
74 | /* maybe a previously executed timeout caused us to be deleted, so |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
75 | * make sure we're still around */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
76 | if (list_find(icq_TimeoutList, t)) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
77 | (t->handler)(t->data); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
78 | } |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
79 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
80 | int _icq_HandleTimeout3(void *p, va_list data) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
81 | { |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
82 | icq_Timeout *t = p; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
83 | int complete = 0; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
84 | time_t current_time = va_arg(data, time_t); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
85 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
86 | if (t->expire_time <= current_time) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
87 | { |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
88 | if (t->single_shot) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
89 | icq_TimeoutDelete(t); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
90 | else |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
91 | t->expire_time = current_time + t->length; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
92 | } |
| 1498 | 93 | else |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
94 | /* traversal is complete when we reach an expire time in the future */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
95 | complete = 1; |
| 1498 | 96 | |
| 97 | return complete; | |
| 98 | } | |
| 99 | ||
| 100 | void icq_HandleTimeout() | |
| 101 | { | |
| 102 | time_t current_time = time(NULL); | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
103 | list *expired_timeouts = list_new(); |
| 1498 | 104 | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
105 | icq_CurrentTimeout = NULL; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
106 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
107 | /* these three operations must be split up, in the case where a |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
108 | * timeout function causes timers to be deleted - this ensures |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
109 | * we don't try to free any timers that have already been removed |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
110 | * or corrupt the list traversal process */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
111 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
112 | /* determine which timeouts that have expired */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
113 | list_traverse(icq_TimeoutList, _icq_HandleTimeout1, current_time, |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
114 | expired_timeouts); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
115 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
116 | /* call handler function for expired timeouts */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
117 | list_traverse(expired_timeouts, _icq_HandleTimeout2); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
118 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
119 | /* delete any expired timeouts */ |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
120 | list_traverse(icq_TimeoutList, _icq_HandleTimeout3, current_time); |
| 1498 | 121 | |
| 122 | if (icq_TimeoutList->count) | |
| 123 | icq_TimeoutDoNotify(); | |
| 124 | } | |
| 125 | ||
| 126 | void icq_TimeoutDoNotify() | |
| 127 | { | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
128 | time_t length, current_time = time(NULL); |
| 1498 | 129 | |
|
1525
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
130 | if (!icq_TimeoutList->count) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
131 | { |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
132 | if (icq_SetTimeout) |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
133 | (*icq_SetTimeout)(0); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
134 | return; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
135 | } |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
136 | |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
137 | icq_CurrentTimeout = (icq_Timeout *)list_first(icq_TimeoutList); |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
138 | length = icq_CurrentTimeout->expire_time - current_time; |
|
b4ece1a718cd
[gaim-migrate @ 1535]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1498
diff
changeset
|
139 | |
| 1498 | 140 | if (icq_SetTimeout) |
| 141 | (*icq_SetTimeout)(length); | |
| 142 | } |