Go to the source code of this file.
Data Structures | |
struct | egg_timeval |
struct | egg_timer |
Defines | |
#define | TIMER_REPEAT 1 |
#define | timer_create(howlong, name, callback) timer_create_complex(howlong, name, callback, NULL, 0, NULL) |
#define | timer_create_repeater(howlong, name, callback) timer_create_complex(howlong, name, callback, NULL, TIMER_REPEAT, NULL) |
Typedefs | |
typedef struct egg_timeval | egg_timeval_t |
typedef struct egg_timer | egg_timer_t |
Functions | |
int | timer_init () |
int | timer_shutdown () |
int | timer_get_time (egg_timeval_t *curtime) |
void | timer_get_now (egg_timeval_t *_now) |
long | timer_get_now_sec (long *sec) |
long | timer_update_now (egg_timeval_t *_now) |
int | timer_diff (egg_timeval_t *from_time, egg_timeval_t *to_time, egg_timeval_t *diff) |
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) |
char * | timer_get_timestamp (void) |
#define timer_create | ( | howlong, | |||
name, | |||||
callback | ) | timer_create_complex(howlong, name, callback, NULL, 0, NULL) |
#define timer_create_repeater | ( | howlong, | |||
name, | |||||
callback | ) | timer_create_complex(howlong, name, callback, NULL, TIMER_REPEAT, NULL) |
Definition at line 48 of file timer.h.
Referenced by events_init(), main(), throttle_on(), and timer_create_secs().
#define TIMER_REPEAT 1 |
Definition at line 42 of file timer.h.
Referenced by chanserv_init(), got_version(), recving_login(), script_repeat_timer(), sending_login(), and timer_run().
typedef struct egg_timer egg_timer_t |
typedef struct egg_timeval egg_timeval_t |
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_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 }