#include <eggdrop/eggdrop.h>
Go to the source code of this file.
Defines | |
#define | TIMEBUFLEN 1024 |
Functions | |
int | timer_init () |
int | timer_shutdown () |
int | timer_get_time (egg_timeval_t *curtime) |
long | timer_update_now (egg_timeval_t *_now) |
void | timer_get_now (egg_timeval_t *_now) |
long | timer_get_now_sec (long *sec) |
int | timer_diff (egg_timeval_t *from_time, egg_timeval_t *to_time, egg_timeval_t *diff) |
static int | timer_add_to_list (egg_timer_t *timer) |
int | timer_create_secs (long secs, const char *name, Function callback) |
int | timer_create_complex (egg_timeval_t *howlong, const char *name, Function callback, void *client_data, int flags, event_owner_t *owner) |
int | timer_destroy (int timer_id) |
int | timer_destroy_all () |
int | timer_destroy_by_owner (egg_module_t *module, void *script) |
int | timer_get_shortest (egg_timeval_t *howlong) |
int | timer_run () |
egg_timer_t * | timer_list () |
egg_timer_t * | timer_find (int id) |
int | timer_set_timestamp (char *format) |
char * | timer_get_timestamp (void) |
Variables | |
static const char | rcsid [] = "$Id: timer.c,v 1.14 2006-10-11 01:54:04 sven Exp $" |
static egg_timeval_t | now |
static char * | timestamp_format = NULL |
static char | timestamp [TIMEBUFLEN] |
static egg_timer_t * | timer_list_head = NULL |
static int | timer_next_id = 1 |
#define TIMEBUFLEN 1024 |
static int timer_add_to_list | ( | egg_timer_t * | timer | ) | [static] |
Definition at line 108 of file timer.c.
References egg_timer::next, NULL, egg_timeval::sec, egg_timer::trigger_time, and egg_timeval::usec.
Referenced by timer_create_complex(), and timer_run().
00109 { 00110 egg_timer_t *prev, *ptr; 00111 00112 /* Find out where this should go in the list. */ 00113 prev = NULL; 00114 for (ptr = timer_list_head; ptr; ptr = ptr->next) { 00115 if (timer->trigger_time.sec < ptr->trigger_time.sec) break; 00116 if (timer->trigger_time.sec == ptr->trigger_time.sec && timer->trigger_time.usec < ptr->trigger_time.usec) break; 00117 prev = ptr; 00118 } 00119 00120 /* Insert into timer list. */ 00121 if (prev) { 00122 timer->next = prev->next; 00123 prev->next = timer; 00124 } 00125 else { 00126 timer->next = timer_list_head; 00127 timer_list_head = timer; 00128 } 00129 return(0); 00130 }
int timer_create_complex | ( | egg_timeval_t * | howlong, | |
const char * | name, | |||
Function | callback, | |||
void * | client_data, | |||
int | flags, | |||
event_owner_t * | owner | |||
) |
Definition at line 142 of file timer.c.
References egg_timer::callback, egg_timer::client_data, egg_timer::flags, egg_timer::howlong, egg_timer::id, egg_timer::name, egg_timer::next, NULL, egg_timer::owner, egg_timeval::sec, timer_add_to_list(), timer_next_id, egg_timer::trigger_time, and egg_timeval::usec.
Referenced by attach(), chanserv_init(), dcc_accept_send(), dcc_listen(), script_timer(), and socktimer_on().
00143 { 00144 static int wraparound = 0; 00145 egg_timer_t *timer; 00146 00147 /* Make sure the timer uid is really unique */ 00148 if (timer_next_id < 1) { 00149 timer_next_id = 1; 00150 wraparound = 1; 00151 } 00152 if (wraparound) { 00153 do { 00154 for (timer = timer_list_head; timer; timer = timer->next) { 00155 if (timer->id == timer_next_id) { 00156 timer_next_id++; 00157 if (timer_next_id < 1) timer_next_id = 1; 00158 break; 00159 } 00160 } 00161 } while (timer); 00162 } 00163 00164 /* Fill out a new timer. */ 00165 timer = malloc(sizeof(*timer)); 00166 timer->id = timer_next_id++; 00167 if (name) timer->name = strdup(name); 00168 else timer->name = NULL; 00169 timer->callback = callback; 00170 timer->client_data = client_data; 00171 timer->flags = flags; 00172 timer->howlong.sec = howlong->sec; 00173 timer->howlong.usec = howlong->usec; 00174 timer->trigger_time.sec = now.sec + howlong->sec; 00175 timer->trigger_time.usec = now.usec + howlong->usec; 00176 timer->owner = owner; 00177 00178 timer_add_to_list(timer); 00179 00180 return(timer->id); 00181 }
int timer_create_secs | ( | long | secs, | |
const char * | name, | |||
Function | callback | |||
) |
Definition at line 132 of file timer.c.
References egg_timeval::sec, timer_create_repeater, and egg_timeval::usec.
Referenced by egg_dns_init().
00133 { 00134 egg_timeval_t howlong; 00135 00136 howlong.sec = secs; 00137 howlong.usec = 0; 00138 00139 return timer_create_repeater(&howlong, name, callback); 00140 }
int timer_destroy | ( | int | timer_id | ) |
Definition at line 184 of file timer.c.
References egg_timer::client_data, egg_timer::id, egg_timer::name, egg_timer::next, NULL, event_owner_b::on_delete, and egg_timer::owner.
Referenced by dcc_listen_delete(), dcc_recv_connect(), dcc_recv_delete(), detach(), egg_on_delete(), events_shutdown(), main(), socktimer_off(), socktimer_on(), socktimer_on_delete(), and throttle_off().
00185 { 00186 egg_timer_t *prev, *timer; 00187 00188 prev = NULL; 00189 for (timer = timer_list_head; timer; timer = timer->next) { 00190 if (timer->id == timer_id) break; 00191 prev = timer; 00192 } 00193 00194 if (!timer) return(1); /* Not found! */ 00195 00196 /* Unlink it. */ 00197 if (prev) prev->next = timer->next; 00198 else timer_list_head = timer->next; 00199 00200 if (timer->owner && timer->owner->on_delete) timer->owner->on_delete(timer->owner, timer->client_data); 00201 if (timer->name) free(timer->name); 00202 free(timer); 00203 return(0); 00204 }
int timer_destroy_all | ( | ) |
Definition at line 206 of file timer.c.
References egg_timer::client_data, egg_timer::name, egg_timer::next, NULL, event_owner_b::on_delete, and egg_timer::owner.
00207 { 00208 egg_timer_t *timer, *next; 00209 00210 for (timer = timer_list_head; timer; timer = next) { 00211 next = timer->next; 00212 00213 if (timer->owner && timer->owner->on_delete) timer->owner->on_delete(timer->owner, timer->client_data); 00214 if (timer->name) free(timer->name); 00215 free(timer); 00216 } 00217 timer_list_head = NULL; 00218 00219 return(0); 00220 }
int timer_destroy_by_owner | ( | egg_module_t * | module, | |
void * | script | |||
) |
Definition at line 222 of file timer.c.
References egg_timer::client_data, event_owner_b::client_data, event_owner_b::module, egg_timer::name, egg_timer::next, event_owner_b::on_delete, and egg_timer::owner.
Referenced by script_remove_events_by_owner().
00223 { 00224 int removed = 0; 00225 egg_timer_t *timer, *prev = 0, *next; 00226 00227 for (timer = timer_list_head; timer; timer = next) { 00228 next = timer->next; 00229 00230 if (timer->owner && timer->owner->module == module && (!script || timer->owner->client_data == script)) { 00231 if (prev) prev->next = timer->next; 00232 else timer_list_head = timer->next; 00233 ++removed; 00234 00235 if (timer->owner && timer->owner->on_delete) timer->owner->on_delete(timer->owner, timer->client_data); 00236 if (timer->name) free(timer->name); 00237 free(timer); 00238 } else { 00239 prev = timer; 00240 } 00241 } 00242 return removed; 00243 }
int timer_diff | ( | egg_timeval_t * | from_time, | |
egg_timeval_t * | to_time, | |||
egg_timeval_t * | diff | |||
) |
Definition at line 85 of file timer.c.
References egg_timeval::sec, and egg_timeval::usec.
Referenced by gotpong(), script_timer_info(), server_secondly(), and timer_get_shortest().
00086 { 00087 diff->sec = to_time->sec - from_time->sec; 00088 if (diff->sec < 0) { 00089 diff->sec = 0; 00090 diff->usec = 0; 00091 return(1); 00092 } 00093 00094 diff->usec = to_time->usec - from_time->usec; 00095 00096 if (diff->usec < 0) { 00097 if (diff->sec == 0) { 00098 diff->usec = 0; 00099 return(1); 00100 } 00101 diff->sec -= 1; 00102 diff->usec += 1000000; 00103 } 00104 00105 return(0); 00106 }
egg_timer_t* timer_find | ( | int | id | ) |
Definition at line 301 of file timer.c.
References egg_timer::id, egg_timer::next, and NULL.
Referenced by script_timer_info().
00302 { 00303 egg_timer_t *timer; 00304 00305 for (timer = timer_list_head; timer; timer = timer->next) { 00306 if (timer->id == id) return(timer); 00307 } 00308 return(NULL); 00309 }
void timer_get_now | ( | egg_timeval_t * | _now | ) |
Definition at line 72 of file timer.c.
References egg_timeval::sec, and egg_timeval::usec.
Referenced by script_timer_info(), sockbuf_got_readable_server(), sockbuf_on_connect(), sockbuf_on_newclient(), stats_in(), and stats_out().
long timer_get_now_sec | ( | long * | sec | ) |
Definition at line 78 of file timer.c.
References egg_timeval::sec.
Referenced by blowfish_init(), cache_add(), cache_expired(), channel_add_member(), chanserv_update_stats(), cleanup_old_members(), dcc_accept_send(), dcc_recv_connect(), dcc_send_connect(), dcc_send_info(), dcc_start_send(), got_mode(), gottopic(), modefight_cleanup(), parse_chan_mode(), party_timers(), update_snapshot(), and update_stats().
int timer_get_shortest | ( | egg_timeval_t * | howlong | ) |
Definition at line 245 of file timer.c.
References timer_diff(), and egg_timer::trigger_time.
Referenced by main().
00246 { 00247 egg_timer_t *timer = timer_list_head; 00248 00249 /* No timers? Boo. */ 00250 if (!timer) return(1); 00251 00252 timer_diff(&now, &timer->trigger_time, howlong); 00253 00254 return(0); 00255 }
int timer_get_time | ( | egg_timeval_t * | curtime | ) |
Definition at line 52 of file timer.c.
References NULL, egg_timeval::sec, and egg_timeval::usec.
Referenced by gotpong(), server_secondly(), and timer_update_now().
00053 { 00054 struct timeval tv; 00055 00056 (void) gettimeofday(&tv, NULL); 00057 curtime->sec = tv.tv_sec; 00058 curtime->usec = tv.tv_usec; 00059 return(0); 00060 }
char* timer_get_timestamp | ( | void | ) |
Definition at line 317 of file timer.c.
References egg_timeval::sec, TIMEBUFLEN, timestamp, and timestamp_format.
Referenced by flushlogs(), logfile_del(), on_putlog(), partyline_idx_chanmsg(), partyline_idx_join(), partyline_idx_nick(), partyline_idx_part(), partyline_idx_privmsg(), and partyline_idx_quit().
00318 { 00319 time_t now_secs = (time_t)now.sec; 00320 int len; 00321 00322 len = strftime(timestamp, TIMEBUFLEN, timestamp_format, localtime(&now_secs)); 00323 /* Did it work and fit in the buffer? */ 00324 if (!len) *timestamp = 0; 00325 00326 return timestamp; 00327 }
int timer_init | ( | ) |
Definition at line 36 of file timer.c.
References timestamp_format.
Referenced by eggdrop_init().
00037 { 00038 timestamp_format = strdup("[%H:%M] "); 00039 return(0); 00040 }
egg_timer_t* timer_list | ( | ) |
Definition at line 296 of file timer.c.
Referenced by party_timers(), and script_timers().
00297 { 00298 return(timer_list_head); 00299 }
int timer_run | ( | ) |
Definition at line 257 of file timer.c.
References egg_timer::callback, egg_timer::client_data, egg_timer::flags, egg_timer::howlong, egg_timer::name, egg_timer::next, event_owner_b::on_delete, egg_timer::owner, egg_timeval::sec, timer_add_to_list(), TIMER_REPEAT, egg_timer::trigger_time, and egg_timeval::usec.
Referenced by main().
00258 { 00259 egg_timer_t *timer; 00260 Function callback; 00261 void *client_data; 00262 00263 while (timer_list_head) { 00264 timer = timer_list_head; 00265 if (timer->trigger_time.sec > now.sec || (timer->trigger_time.sec == now.sec && timer->trigger_time.usec > now.usec)) break; 00266 00267 timer_list_head = timer_list_head->next; 00268 00269 callback = timer->callback; 00270 client_data = timer->client_data; 00271 00272 callback(client_data); 00273 00274 if (timer->flags & TIMER_REPEAT) { 00275 /* Update timer. */ 00276 timer->trigger_time.sec += timer->howlong.sec; 00277 timer->trigger_time.usec += timer->howlong.usec; 00278 if (timer->trigger_time.usec >= 1000000) { 00279 timer->trigger_time.usec -= 1000000; 00280 timer->trigger_time.sec += 1; 00281 } 00282 00283 /* Add it back into the list. */ 00284 timer_add_to_list(timer); 00285 } 00286 else { 00287 if (timer->owner && timer->owner->on_delete) timer->owner->on_delete(timer->owner, timer->client_data); 00288 if (timer->name) free(timer->name); 00289 free(timer); 00290 } 00291 00292 } 00293 return(0); 00294 }
int timer_set_timestamp | ( | char * | format | ) |
Definition at line 311 of file timer.c.
References str_redup(), and timestamp_format.
00312 { 00313 str_redup(×tamp_format, format); 00314 return(0); 00315 }
int timer_shutdown | ( | ) |
Definition at line 42 of file timer.c.
References NULL, and timestamp_format.
Referenced by eggdrop_shutdown().
00043 { 00044 if (timestamp_format) { 00045 free(timestamp_format); 00046 timestamp_format = NULL; 00047 } 00048 return(0); 00049 }
long timer_update_now | ( | egg_timeval_t * | _now | ) |
Definition at line 62 of file timer.c.
References egg_timeval::sec, timer_get_time(), and egg_timeval::usec.
Referenced by main().
00063 { 00064 timer_get_time(&now); 00065 if (_now) { 00066 _now->sec = now.sec; 00067 _now->usec = now.usec; 00068 } 00069 return(now.sec); 00070 }
egg_timeval_t now [static] |
const char rcsid[] = "$Id: timer.c,v 1.14 2006-10-11 01:54:04 sven Exp $" [static] |
egg_timer_t* timer_list_head = NULL [static] |
int timer_next_id = 1 [static] |
char timestamp[TIMEBUFLEN] [static] |
char* timestamp_format = NULL [static] |
Definition at line 29 of file timer.c.
Referenced by timer_get_timestamp(), timer_init(), timer_set_timestamp(), and timer_shutdown().