]>
jfr.im git - solanum.git/blob - librb/src/event.c
2 * ircd-ratbox: A slightly useful ircd.
3 * event.c: Event functions.
5 * Copyright (C) 1998-2000 Regents of the University of California
6 * Copyright (C) 2001-2002 Hybrid Development Team
7 * Copyright (C) 2002-2005 ircd-ratbox development team
9 * Code borrowed from the squid web cache by Adrian Chadd.
12 * DEBUG: section 41 Event Processing
13 * AUTHOR: Henrik Nordstrom
15 * SQUID Internet Object Cache http://squid.nlanr.net/Squid/
16 * ----------------------------------------------------------
18 * Squid is the result of efforts by numerous individuals from the
19 * Internet community. Development is led by Duane Wessels of the
20 * National Laboratory for Applied Network Research and funded by the
21 * National Science Foundation. Squid is Copyrighted (C) 1998 by
22 * the Regents of the University of California. Please see the
23 * COPYRIGHT file for full details. Squid incorporates software
24 * developed and/or copyrighted by other sources. Please see the
25 * CREDITS file for full details.
27 * This program is free software; you can redistribute it and/or modify
28 * it under the terms of the GNU General Public License as published by
29 * the Free Software Foundation; either version 2 of the License, or
30 * (at your option) any later version.
32 * This program is distributed in the hope that it will be useful,
33 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35 * GNU General Public License for more details.
37 * You should have received a copy of the GNU General Public License
38 * along with this program; if not, write to the Free Software
39 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
42 * $Id: event.c 26272 2008-12-10 05:55:10Z androsyn $
45 #include <librb_config.h>
47 #include <commio-int.h>
48 #include <event-int.h>
50 #define EV_NAME_LEN 33
51 static char last_event_ran
[EV_NAME_LEN
];
52 static rb_dlink_list event_list
;
54 static time_t event_time_min
= -1;
58 * rb_event_find(EVH *func, void *arg)
60 * Input: Event function and the argument passed to it
61 * Output: Index to the slow in the event_table
64 static struct ev_entry
*
65 rb_event_find(EVH
* func
, void *arg
)
69 RB_DLINK_FOREACH(ptr
, event_list
.head
)
72 if((ev
->func
== func
) && (ev
->arg
== arg
))
81 rb_event_add_common(const char *name
, EVH
* func
, void *arg
, time_t when
, time_t frequency
)
84 ev
= rb_malloc(sizeof(struct ev_entry
));
86 ev
->name
= rb_strndup(name
, EV_NAME_LEN
);
88 ev
->when
= rb_current_time() + when
;
90 ev
->frequency
= frequency
;
92 if((ev
->when
< event_time_min
) || (event_time_min
== -1))
93 event_time_min
= ev
->when
;
95 rb_dlinkAdd(ev
, &ev
->node
, &event_list
);
96 rb_io_sched_event(ev
, when
);
102 * rb_event_add(const char *name, EVH *func, void *arg, time_t when)
104 * Input: Name of event, function to call, arguments to pass, and frequency
107 * Side Effects: Adds the event to the event list.
110 rb_event_add(const char *name
, EVH
* func
, void *arg
, time_t when
)
112 if (rb_unlikely(when
<= 0)) {
113 rb_lib_log("rb_event_add: tried to schedule %s event with a delay of "
114 "%d seconds", name
, (int) when
);
118 return rb_event_add_common(name
, func
, arg
, when
, when
);
122 rb_event_addonce(const char *name
, EVH
* func
, void *arg
, time_t when
)
124 if (rb_unlikely(when
<= 0)) {
125 rb_lib_log("rb_event_addonce: tried to schedule %s event to run in "
126 "%d seconds", name
, (int) when
);
130 return rb_event_add_common(name
, func
, arg
, when
, 0);
134 * void rb_event_delete(struct ev_entry *ev)
136 * Input: pointer to ev_entry for the event
138 * Side Effects: Removes the event from the event list
141 rb_event_delete(struct ev_entry
*ev
)
146 rb_dlinkDelete(&ev
->node
, &event_list
);
147 rb_io_unsched_event(ev
);
153 * void rb_event_find_delete(EVH *func, void *arg)
155 * Input: pointer to func and data
157 * Side Effects: Removes the event from the event list
160 rb_event_find_delete(EVH
* func
, void *arg
)
162 rb_event_delete(rb_event_find(func
, arg
));
166 rb_event_frequency(time_t frequency
)
170 const time_t two_third
= (2 * labs(frequency
)) / 3;
171 frequency
= two_third
+ ((rand() % 1000) * two_third
) / 1000;
178 * rb_event_addish(const char *name, EVH *func, void *arg, time_t delta_isa)
180 * Input: Name of event, function to call, arguments to pass, and frequency
183 * Side Effects: Adds the event to the event list within +- 1/3 of the
184 * specified frequency.
187 rb_event_addish(const char *name
, EVH
* func
, void *arg
, time_t delta_ish
)
189 delta_ish
= labs(delta_ish
);
191 delta_ish
= -delta_ish
;
192 return rb_event_add_common(name
, func
, arg
,
193 rb_event_frequency(delta_ish
), delta_ish
);
198 rb_run_event(struct ev_entry
*ev
)
200 rb_strlcpy(last_event_ran
, ev
->name
, sizeof(last_event_ran
));
207 ev
->when
= rb_current_time() + rb_event_frequency(ev
->frequency
);
208 if((ev
->when
< event_time_min
) || (event_time_min
== -1))
209 event_time_min
= ev
->when
;
213 * void rb_event_run(void)
217 * Side Effects: Runs pending events in the event list
222 rb_dlink_node
*ptr
, *next
;
225 if(rb_io_supports_event())
229 RB_DLINK_FOREACH_SAFE(ptr
, next
, event_list
.head
)
232 if(ev
->when
<= rb_current_time())
234 rb_strlcpy(last_event_ran
, ev
->name
, sizeof(last_event_ran
));
237 /* event is scheduled more than once */
240 ev
->when
= rb_current_time() + rb_event_frequency(ev
->frequency
);
241 if((ev
->when
< event_time_min
) || (event_time_min
== -1))
242 event_time_min
= ev
->when
;
246 rb_dlinkDelete(&ev
->node
, &event_list
);
252 if((ev
->when
< event_time_min
) || (event_time_min
== -1))
253 event_time_min
= ev
->when
;
259 rb_event_io_register_all(void)
264 if(!rb_io_supports_event())
267 RB_DLINK_FOREACH(ptr
, event_list
.head
)
270 rb_io_sched_event(ev
, ev
->next
);
275 * void rb_event_init(void)
279 * Side Effects: Initializes the event system.
284 rb_strlcpy(last_event_ran
, "NONE", sizeof(last_event_ran
));
288 rb_dump_events(void (*func
) (char *, void *), void *ptr
)
296 snprintf(buf
, len
, "Last event to run: %s", last_event_ran
);
299 rb_strlcpy(buf
, "Operation Next Execution", len
);
302 RB_DLINK_FOREACH(dptr
, event_list
.head
)
305 snprintf(buf
, len
, "%-28s %-4ld seconds (frequency=%d)", ev
->name
,
306 ev
->when
- (long)rb_current_time(), (int)ev
->frequency
);
312 * void rb_set_back_events(time_t by)
313 * Input: Time to set back events by.
315 * Side-effects: Sets back all events by "by" seconds.
318 rb_set_back_events(time_t by
)
322 RB_DLINK_FOREACH(ptr
, event_list
.head
)
333 rb_event_update(struct ev_entry
*ev
, time_t freq
)
338 ev
->frequency
= freq
;
340 /* update when it's scheduled to run if it's higher
341 * than the new frequency
343 time_t next
= rb_event_frequency(freq
);
344 if((rb_current_time() + next
) < ev
->when
)
345 ev
->when
= rb_current_time() + next
;
352 return event_time_min
;