]>
jfr.im git - irc/rakaur/praxis.git/blob - src/core/event.c
078e2d54cd8a994f28d35db874bb72428221e7fa
1 /* praxis: services for TSora IRC networks.
2 * src/event.c: The event loop routines.
4 * Copyright (c) 2004 Eric Will <rakaur@malkier.net>
5 * Copyright (c) 2003-2004 shrike development team.
17 static Heap
*eventq_heap
;
20 * Initialises the event system.
28 eventq_heap
= ballocHeapCreate(sizeof(EventQ
), EVENTQ_HEAP_SIZE
);
30 memset(&event_table
, '\0', (sizeof(Event
) * E_LAST
));
31 memset(&event_queue
, '\0', sizeof(event_queue
));
33 if (eventq_heap
== NULL
)
35 ilog(L_INFO
, "eventInit(): ballocHeapCreate() failed!");
41 * Adds a function to be called when an event happens.
43 * inputs - E_event, pointer to function
47 eventAdd(uint event
, uchar (*func
) ())
50 iassert(event
< E_LAST
);
51 iassert(func
!= NULL
);
53 ilog(L_DEBUG2
, "eventAdd(): Registering function for event: %d", event
);
55 dlinkAddTailAlloc(func
, &event_table
[event
].func_list
);
59 * Adds a function to be called first or last when an event happens.
61 * inputs - E_event, 1 for first 2 for last, pointer to function
62 * outputs - 1 on success or 0 on failure
65 eventAddSpecial(uint event
, uchar type
, uchar (*func
) ())
68 iassert(event
< E_LAST
);
69 iassert(type
== 1 || type
== 2);
70 iassert(func
!= NULL
);
74 if (event_table
[event
].first_func
!= NULL
)
77 ilog(L_DEBUG2
, "eventAddSpecial(): Registering first function for "
80 event_table
[event
].first_func
= func
;
84 if (event_table
[event
].last_func
!= NULL
)
87 ilog(L_DEBUG2
, "eventAddSpecial(): Registering last function for "
90 event_table
[event
].last_func
= func
;
99 * Removes a function to be called when an event happens.
101 * inputs - E_event, pointer to function
102 * outputs - 1 on success or 0 on failure
105 eventDelete(uint event
, uchar (*func
) ())
110 iassert(event
< E_LAST
);
111 iassert(func
!= NULL
);
113 ilog(L_DEBUG2
, "eventDelete(): Unregistering function for event: %d",
116 ret
= dlinkFindDestroy(func
, &event_table
[event
].func_list
);
120 ilog(L_ERROR
, "eventDelete(): dlinkFindDestroy() failed.");
127 /* eventDeleteSpecial()
128 * Removes a function to be called first or last when an event happens.
130 * inputs - E_event, 1 for first 2 for last, pointer to function
131 * outputs - 1 on success or 0 on failure
134 eventDeleteSpecial(uint event
, uchar type
, uchar (*func
) ())
137 iassert(event
< E_LAST
);
138 iassert(type
== 1 || type
== 2);
139 iassert(func
!= NULL
);
143 if (event_table
[event
].first_func
!= func
)
146 ilog(L_DEBUG2
, "eventDeleteSpecial(): Unregistering first function for "
149 event_table
[event
].first_func
= NULL
;
153 if (event_table
[event
].last_func
!= func
)
156 ilog(L_DEBUG2
, "eventDeleteSpecial(): Unregistering last function for "
159 event_table
[event
].last_func
= NULL
;
168 * Post an event to the event_queue that has happened.
170 * inputs - E_event, argument
174 eventPost(uint event
, void *arg
)
179 iassert(event
< E_LAST
);
181 /* Check to see if this Event is being handled. */
182 if ((event_table
[event
].first_func
== NULL
) &&
183 (dlinkLength(&event_table
[event
].func_list
) == 0) &&
184 (event_table
[event
].last_func
== NULL
))
187 eventq_p
= ballocHeapAlloc(eventq_heap
);
189 eventq_p
->event
= event
;
192 dlinkAddTailAlloc(eventq_p
, &event_queue
);
196 * Returns if we need to clear the queue or not.
199 * outputs - 1 for yes, or 0 for no
204 if (dlinkLength(&event_queue
) != 0)
211 * Runs all pending events.
220 DLinkNode
*node_p
, *tnode_p
, *node2_p
;
222 uchar ret
, terminated
= 0;
224 /* Should we even bother? */
225 if (dlinkLength(&event_queue
) == 0)
228 DLINK_FOREACH_SAFE(node_p
, tnode_p
, event_queue
.head
)
230 eventq_p
= node_p
->data
;
232 /* If there's a first function, call it. */
233 if (event_table
[eventq_p
->event
].first_func
!= NULL
)
235 ret
= event_table
[eventq_p
->event
].first_func(eventq_p
->arg
);
239 ilog(L_ERROR
, "eventRun(): first_func failure for event: %d.",
246 /* If there are function list entries, call them. */
247 DLINK_FOREACH(node2_p
, event_table
[eventq_p
->event
].func_list
.head
)
249 func
= node2_p
->data
;
254 ret
= func(eventq_p
->arg
);
258 ilog(L_ERROR
, "eventRun(): func_list failure for event: %d.",
265 /* If there's a last function, call it. */
266 if (event_table
[eventq_p
->event
].last_func
!= NULL
)
268 ret
= event_table
[eventq_p
->event
].last_func(eventq_p
->arg
);
272 ilog(L_ERROR
, "eventRun(): last_func failure for event: %d.",
277 /* Now destroy the event_queue entry. */
278 dlinkDestroy(node_p
, &event_queue
);
279 ballocHeapFree(eventq_heap
, eventq_p
);