Debug custom event loop

This commit is contained in:
Willem Toorop 2015-08-26 17:01:28 +02:00
parent 4ecf6b23dc
commit 32e4e8fa9d
1 changed files with 29 additions and 12 deletions

View File

@ -33,6 +33,12 @@
#include <getdns/getdns.h> #include <getdns/getdns.h>
#include <getdns/getdns_extra.h> #include <getdns/getdns_extra.h>
#if 0
#define DEBUG_GQ(...) do {fprintf(stderr, __VA_ARGS__);} while (0)
#else
#define DEBUG_GQ(...) do {} while (0)
#endif
#define MAX_TIMEOUTS FD_SETSIZE #define MAX_TIMEOUTS FD_SETSIZE
/* Eventloop based on select */ /* Eventloop based on select */
@ -69,14 +75,16 @@ my_eventloop_schedule(getdns_eventloop *loop,
assert(event); assert(event);
assert(fd < FD_SETSIZE); assert(fd < FD_SETSIZE);
DEBUG_GQ( "%s(loop: %p, fd: %d, timeout: %"PRIu64", event: %p)\n"
, __FUNCTION__, loop, fd, timeout, event);
if (fd >= 0 && (event->read_cb || event->write_cb)) { if (fd >= 0 && (event->read_cb || event->write_cb)) {
assert(event->read_cb || event->write_cb);
assert(my_loop->fd_events[fd] == NULL); assert(my_loop->fd_events[fd] == NULL);
my_loop->fd_events[fd] = event; my_loop->fd_events[fd] = event;
my_loop->fd_timeout_times[fd] = get_now_plus(timeout); my_loop->fd_timeout_times[fd] = get_now_plus(timeout);
event->ev = (void *) (intptr_t) fd; event->ev = (void *) (intptr_t) fd + 1;
DEBUG_GQ( "scheduled read/write at %d\n", fd);
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} }
@ -86,8 +94,9 @@ my_eventloop_schedule(getdns_eventloop *loop,
if (my_loop->timeout_events[i] == NULL) { if (my_loop->timeout_events[i] == NULL) {
my_loop->timeout_events[i] = event; my_loop->timeout_events[i] = event;
my_loop->timeout_times[i] = get_now_plus(timeout); my_loop->timeout_times[i] = get_now_plus(timeout);
event->ev = (void *) (intptr_t) i; event->ev = (void *) (intptr_t) i + 1;
DEBUG_GQ( "scheduled timeout at %d\n", (int)i);
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} }
} }
@ -98,16 +107,22 @@ getdns_return_t
my_eventloop_clear(getdns_eventloop *loop, getdns_eventloop_event *event) my_eventloop_clear(getdns_eventloop *loop, getdns_eventloop_event *event)
{ {
my_eventloop *my_loop = (my_eventloop *)loop; my_eventloop *my_loop = (my_eventloop *)loop;
size_t i;
assert(loop); assert(loop);
assert(event); assert(event);
DEBUG_GQ( "%s(loop: %p, event: %p)\n", __FUNCTION__, loop, event);
i = (intptr_t)event->ev - 1;
assert(i >= 0 && i < FD_SETSIZE);
if (event->timeout_cb && !event->read_cb && !event->write_cb) { if (event->timeout_cb && !event->read_cb && !event->write_cb) {
assert(my_loop->timeout_events[(intptr_t)event->ev] == event); assert(my_loop->timeout_events[i] == event);
my_loop->timeout_events[(intptr_t)event->ev] = NULL; my_loop->timeout_events[i] = NULL;
} else { } else {
assert(my_loop->fd_events[(intptr_t)event->ev] == event); assert(my_loop->fd_events[i] == event);
my_loop->fd_events[(intptr_t)event->ev] = NULL; my_loop->fd_events[i] = NULL;
} }
event->ev = NULL; event->ev = NULL;
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
@ -119,17 +134,19 @@ void my_eventloop_cleanup(getdns_eventloop *loop)
void my_read_cb(int fd, getdns_eventloop_event *event) void my_read_cb(int fd, getdns_eventloop_event *event)
{ {
DEBUG_GQ( "%s(fd: %d, event: %p)\n", __FUNCTION__, fd, event);
event->read_cb(event->userarg); event->read_cb(event->userarg);
} }
void my_write_cb(int fd, getdns_eventloop_event *event) void my_write_cb(int fd, getdns_eventloop_event *event)
{ {
DEBUG_GQ( "%s(fd: %d, event: %p)\n", __FUNCTION__, fd, event);
event->write_cb(event->userarg); event->write_cb(event->userarg);
} }
void my_timeout_cb(uint64_t now, uint64_t timeout, void my_timeout_cb(int fd, getdns_eventloop_event *event)
int fd, getdns_eventloop_event *event)
{ {
DEBUG_GQ( "%s(fd: %d, event: %p)\n", __FUNCTION__, fd, event);
event->timeout_cb(event->userarg); event->timeout_cb(event->userarg);
} }
@ -153,7 +170,7 @@ void my_eventloop_run_once(getdns_eventloop *loop, int blocking)
if (!my_loop->timeout_events[i]) if (!my_loop->timeout_events[i])
continue; continue;
if (now > my_loop->timeout_times[i]) if (now > my_loop->timeout_times[i])
my_timeout_cb(now, my_loop->timeout_times[i], -1, my_loop->timeout_events[i]); my_timeout_cb(-1, my_loop->timeout_events[i]);
else if (my_loop->timeout_times[i] < timeout) else if (my_loop->timeout_times[i] < timeout)
timeout = my_loop->timeout_times[i]; timeout = my_loop->timeout_times[i];
} }
@ -198,13 +215,13 @@ void my_eventloop_run_once(getdns_eventloop *loop, int blocking)
if (my_loop->fd_events[fd] && if (my_loop->fd_events[fd] &&
my_loop->fd_events[fd]->timeout_cb && my_loop->fd_events[fd]->timeout_cb &&
now > my_loop->fd_timeout_times[fd]) now > my_loop->fd_timeout_times[fd])
my_timeout_cb(now, my_loop->fd_timeout_times[fd], fd, my_loop->fd_events[fd]); my_timeout_cb(fd, my_loop->fd_events[fd]);
i = fd; i = fd;
if (my_loop->timeout_events[i] && if (my_loop->timeout_events[i] &&
my_loop->timeout_events[i]->timeout_cb && my_loop->timeout_events[i]->timeout_cb &&
now > my_loop->timeout_times[i]) now > my_loop->timeout_times[i])
my_timeout_cb(now, my_loop->timeout_times[i], -1, my_loop->timeout_events[i]); my_timeout_cb(-1, my_loop->timeout_events[i]);
} }
} }