2 #include <aura/private.h>
3 #include <sys/eventfd.h>
12 static void eventloop_recalculate_timeouts(
struct aura_eventloop *loop)
14 loop->poll_timeout = 5000;
15 struct aura_node *pos;
16 list_for_each_entry(pos, &loop->nodelist, eventloop_node_list) {
17 if (pos->poll_timeout < loop->poll_timeout)
18 loop->poll_timeout = pos->poll_timeout;
20 slog(4, SLOG_DEBUG,
"Adjusted event poll timeout to %d ms", pos->poll_timeout);
23 static void eventloop_fd_changed_cb(
const struct aura_pollfds *fd,
enum aura_fd_action act,
void *arg)
25 struct aura_eventloop *loop = arg;
26 aura_eventsys_backend_fd_action(loop->eventsysdata, fd, act);
43 if ((curloop != NULL) && (!curloop->autocreated))
44 BUG(node,
"Specified node is already bound to an event-system");
46 if (curloop != NULL) {
47 slog(4, SLOG_DEBUG,
"eventloop: Node has an associated auto-created eventsystem, destroying...");
52 list_add_tail(&node->eventloop_node_list, &loop->nodelist);
53 aura_eventloop_set_data(node, loop);
55 if (loop->poll_timeout > node->poll_timeout)
56 loop->poll_timeout = node->poll_timeout;
71 const struct aura_pollfds *fds;
77 BUG(node,
"Specified node is not bound to any eventloop");
80 list_del(&node->eventloop_node_list);
81 aura_eventloop_set_data(node, NULL);
84 eventloop_recalculate_timeouts(loop);
87 count = aura_get_pollfds(node, &fds);
88 for (i=0; i<count; i++)
89 aura_eventsys_backend_fd_action(loop->eventsysdata, &fds[i], AURA_FD_REMOVED);
103 struct aura_eventloop *loop = calloc(1,
sizeof(*loop));
108 loop->poll_timeout = 5000;
109 loop->eventsysdata = aura_eventsys_backend_create(loop);
110 if (!loop->eventsysdata)
113 INIT_LIST_HEAD(&loop->nodelist);
130 struct aura_node *node;
138 while ((node = va_arg(ap,
struct aura_node *)))
171 list_for_each_safe(pos, tmp, &loop->nodelist) {
172 struct aura_node *node = list_entry(pos,
struct aura_node,
173 eventloop_node_list);
177 aura_eventsys_backend_destroy(loop->eventsysdata);
189 loop->keep_running = 1;
190 while (loop->keep_running)
219 struct aura_node *pos;
221 aura_eventsys_backend_wait(loop->eventsysdata, timeout_ms);
223 list_for_each_entry(pos, &loop->nodelist, eventloop_node_list) {
224 aura_process_node_event(pos, NULL);
225 #ifdef AURA_USE_BUFFER_POOL
227 if (pos->num_buffers_in_pool >= pos->gc_threshold) {
229 pos->num_buffers_in_pool--;
231 list_del(pos->buffer_pool.prev);
246 loop->keep_running = 0;
247 aura_eventloop_interrupt(loop);
266 void aura_eventloop_interrupt(
struct aura_eventloop *loop)
268 aura_eventsys_backend_interrupt(loop->eventsysdata);
279 void aura_eventloop_report_event(
struct aura_eventloop *loop,
struct aura_pollfds *ap)
281 struct aura_node *node;
283 if (ap->magic != 0xdeadbeaf)
284 BUG(NULL,
"bad APFD: %x", ap);
286 aura_process_node_event(node, ap);
288 list_for_each_entry(node, &loop->nodelist, eventloop_node_list) {
289 aura_process_node_event(node, NULL);
void * aura_eventloop_vcreate(va_list ap)
void aura_handle_events_forever(struct aura_eventloop *loop)
void * aura_eventloop_create__(int dummy,...)
void aura_eventloop_add(struct aura_eventloop *loop, struct aura_node *node)
void * aura_eventloop_create_empty()
void aura_handle_events_timeout(struct aura_eventloop *loop, int timeout_ms)
struct aura_eventloop * aura_eventloop_get_data(struct aura_node *node)
void aura_handle_events(struct aura_eventloop *loop)
void aura_eventloop_destroy(struct aura_eventloop *loop)
void aura_fd_changed_cb(struct aura_node *node, void(*cb)(const struct aura_pollfds *fd, enum aura_fd_action act, void *arg), void *arg)
void aura_eventloop_del(struct aura_node *node)
void aura_eventloop_break(struct aura_eventloop *loop)
void aura_buffer_destroy(struct aura_buffer *buf)