lib/eggdrop/timer.c File Reference

#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_ttimer_list ()
egg_timer_ttimer_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_ttimer_list_head = NULL
static int timer_next_id = 1


Define Documentation

#define TIMEBUFLEN   1024

Definition at line 26 of file timer.c.

Referenced by timer_get_timestamp().


Function Documentation

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().

00073 {
00074   _now->sec = now.sec;
00075   _now->usec = now.usec;
00076 }

long timer_get_now_sec ( long *  sec  ) 

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(&timestamp_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 }


Variable Documentation

egg_timeval_t now [static]

Definition at line 28 of file timer.c.

const char rcsid[] = "$Id: timer.c,v 1.14 2006-10-11 01:54:04 sven Exp $" [static]

Definition at line 21 of file timer.c.

egg_timer_t* timer_list_head = NULL [static]

Definition at line 33 of file timer.c.

int timer_next_id = 1 [static]

Definition at line 34 of file timer.c.

Referenced by timer_create_complex().

char timestamp[TIMEBUFLEN] [static]

Definition at line 30 of file timer.c.

Referenced by timer_get_timestamp().

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().


Generated on Sun Nov 30 18:43:35 2008 for eggdrop1.9 by  doxygen 1.5.6