X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/75d64210316e5f0e607eecf9abec4dea8151bb2c..1cf4ef2f03a2dd2cd0ae7bcd23f3670becbcdd17:/lib/event.c diff --git a/lib/event.c b/lib/event.c index 0745695..3618bf4 100644 --- a/lib/event.c +++ b/lib/event.c @@ -161,7 +161,7 @@ static inline int gt(const struct timeval *a, const struct timeval *b) { /** @brief Greater-than-or-equal comparison for timevals * - * Ought to be in @file lib/timeval.h + * Ought to be in @ref lib/timeval.h */ static inline int ge(const struct timeval *a, const struct timeval *b) { return !gt(b, a); @@ -388,6 +388,7 @@ int ev_fd_cancel(ev_source *ev, ev_fdmode mode, int fd) { * cancelled. */ int ev_fd_enable(ev_source *ev, ev_fdmode mode, int fd) { + assert(fd >= 0); D(("enabling mode %s fd %d", modenames[mode], fd)); FD_SET(fd, &ev->mode[mode].enabled); return 0; @@ -418,15 +419,17 @@ void ev_report(ev_source *ev) { struct dynstr d[1]; char b[4096]; + if(!debugging) + return; dynstr_init(d); for(mode = 0; mode < ev_nmodes; ++mode) { - info("mode %s maxfd %d", modenames[mode], ev->mode[mode].maxfd); + D(("mode %s maxfd %d", modenames[mode], ev->mode[mode].maxfd)); for(n = 0; n < ev->mode[mode].nfds; ++n) { fd = ev->mode[mode].fds[n].fd; - info("fd %s %d%s%s (%s)", modenames[mode], fd, - FD_ISSET(fd, &ev->mode[mode].enabled) ? " enabled" : "", - FD_ISSET(fd, &ev->mode[mode].tripped) ? " tripped" : "", - ev->mode[mode].fds[n].what); + D(("fd %s %d%s%s (%s)", modenames[mode], fd, + FD_ISSET(fd, &ev->mode[mode].enabled) ? " enabled" : "", + FD_ISSET(fd, &ev->mode[mode].tripped) ? " tripped" : "", + ev->mode[mode].fds[n].what)); } d->nvec = 0; for(fd = 0; fd <= ev->mode[mode].maxfd; ++fd) { @@ -444,7 +447,7 @@ void ev_report(ev_source *ev) { dynstr_append_string(d, b); } dynstr_terminate(d); - info("%s enabled:%s", modenames[mode], d->vec); + D(("%s enabled:%s", modenames[mode], d->vec)); } } @@ -452,7 +455,7 @@ void ev_report(ev_source *ev) { /** @brief Register a timeout * @param ev Event source - * @param handle Where to store timeout handle, or @c NULL + * @param handlep Where to store timeout handle, or @c NULL * @param when Earliest time to call @p callback, or @c NULL * @param callback Function to call at or after @p when * @param u Passed to @p callback @@ -971,15 +974,17 @@ static int writer_shutdown(ev_source *ev, if(w->fd == -1) return 0; /* already shut down */ - info("writer_shutdown fd=%d", w->fd); + D(("writer_shutdown fd=%d error=%d", w->fd, w->error)); ev_timeout_cancel(ev, w->timeout); ev_fd_cancel(ev, ev_write, w->fd); w->timeout = 0; if(w->reader) { + D(("found a tied reader")); /* If there is a reader still around we just untie it */ w->reader->writer = 0; shutdown(w->fd, SHUT_WR); /* there'll be no more writes */ } else { + D(("no tied reader")); /* There's no reader so we are free to close the FD */ xclose(w->fd); } @@ -1064,6 +1069,8 @@ static int ev_writer_write(struct sink *sk, const void *s, int n) { if(!n) return 0; /* avoid silliness */ + if(w->fd == -1) + error(0, "ev_writer_write on %s after shutdown", w->what); if(w->spacebound && w->b.end - w->b.start + n > w->spacebound) { /* The new buffer contents will exceed the space bound. We assume that the * remote client has gone away and TCP hasn't noticed yet, or that it's got @@ -1233,14 +1240,16 @@ static int reader_shutdown(ev_source *ev, if(r->fd == -1) return 0; /* already shut down */ - info("reader_shutdown fd=%d", r->fd); + D(("reader_shutdown fd=%d", r->fd)); ev_fd_cancel(ev, ev_read, r->fd); r->eof = 1; if(r->writer) { + D(("found a tied writer")); /* If there is a writer still around we just untie it */ r->writer->reader = 0; shutdown(r->fd, SHUT_RD); /* there'll be no more reads */ } else { + D(("no tied writer found")); /* There's no writer so we are free to close the FD */ xclose(r->fd); }