X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FIOEngine_kevent.c;h=9a6f19056e3cf26e938b440d05265b247ff0af44;hb=e18ef9b450a0704ff5c55545f70e3f1ec215a5e6;hp=ee93f8645f09f63a25cb750df661d70b91c3d535;hpb=5ad65e65d2234b02151ea7ca17e3fa9893a9b165;p=IOMultiplexer.git diff --git a/src/IOEngine_kevent.c b/src/IOEngine_kevent.c index ee93f86..9a6f190 100644 --- a/src/IOEngine_kevent.c +++ b/src/IOEngine_kevent.c @@ -31,48 +31,58 @@ static int engine_kevent_init() { return 1; } -static void engine_kevent_add(struct IODescriptor *iofd) { - if(iofd->type == IOTYPE_TIMER) return; +static void engine_kevent_add(struct IOLowlevelDescriptor *iold) { + if(iold->fd != -1) return; //add descriptor to the kevent queue struct kevent changes[2]; int nchanges = 0; int res; - EV_SET(&changes[nchanges++], iofd->fd, EVFILT_READ, EV_ADD, 0, 0, iofd); - if (iohandler_wants_writes(iofd)) - EV_SET(&changes[nchanges++], iofd->fd, EVFILT_WRITE, EV_ADD, 0, 0, iofd); + if (iold->flags & IOFLAGS_WANT_READ) + EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_ADD, 0, 0, iold); + if (iold->flags & IOFLAGS_WANT_WRITE) + EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_ADD, 0, 0, iold); res = kevent(kevent_fd, changes, nchanges, NULL, 0, NULL); if(res < 0) - iohandler_log(IOLOG_ERROR, "could not add IODescriptor %d to kevent queue. (returned: %d)", res); + iohandler_log(IOLOG_ERROR, "could not add IOLowlevelDescriptor %d to kevent queue. (returned: %d)", res); } -static void engine_kevent_remove(struct IODescriptor *iofd) { - if(iofd->type == IOTYPE_TIMER) return; +static void engine_kevent_remove(struct IOLowlevelDescriptor *iold) { + if(iold->fd != -1) return; struct kevent changes[2]; int nchanges = 0; - EV_SET(&changes[nchanges++], iofd->fd, EVFILT_READ, EV_DELETE, 0, 0, iofd); - EV_SET(&changes[nchanges++], iofd->fd, EVFILT_WRITE, EV_DELETE, 0, 0, iofd); + EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_DELETE, 0, 0, iold); + EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_DELETE, 0, 0, iold); kevent(kevent_fd, changes, nchanges, NULL, 0, NULL); } -static void engine_kevent_update(struct IODescriptor *iofd) { - if(iofd->type == IOTYPE_TIMER) return; - if(iofd->state == IO_CLOSED) { - engine_kevent_remove(iofd); - return; +static void engine_kevent_update(struct IOLowlevelDescriptor *iold) { + if(iold->fd != -1) return; + struct IODescriptor *iofd; + if((iofd = IOLOWLEVEL_GET_IOFD(iold))) { + if(iofd->state == IO_CLOSED) { + engine_kevent_remove(iold); + return; + } } struct kevent changes[2]; int nchanges = 0; int res; - EV_SET(&changes[nchanges++], iofd->fd, EVFILT_READ, EV_ADD, 0, 0, iofd); - EV_SET(&changes[nchanges++], iofd->fd, EVFILT_WRITE, iohandler_wants_writes(iofd) ? EV_ADD : EV_DELETE, 0, 0, iofd); + if (iold->flags & IOFLAGS_WANT_READ) + EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_ADD, 0, 0, iold); + else + EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_DELETE, 0, 0, iold); + if (iold->flags & IOFLAGS_WANT_WRITE) + EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_ADD, 0, 0, iold); + else + EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_DELETE, 0, 0, iold); res = kevent(kevent_fd, changes, nchanges, NULL, 0, NULL); if(res < 0) { - iohandler_log(IOLOG_ERROR, "could not update IODescriptor %d in kevent queue. (returned: %d)", res); + iohandler_log(IOLOG_ERROR, "could not update IOLowlevelDescriptor %d in kevent queue. (returned: %d)", res); } } @@ -82,6 +92,7 @@ static void engine_kevent_loop(struct timeval *timeout) { struct timespec ts, *pts; int msec; int kevent_result; + struct IOLowlevelDescriptor *iold; gettimeofday(&now, NULL); @@ -127,8 +138,13 @@ static void engine_kevent_loop(struct timeval *timeout) { } } else { int i; - for(i = 0; i < kevent_result; i++) - iohandler_events(events[i].udata, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE)); + for(i = 0; i < kevent_result; i++) { + iold = events[i].udata; + if(iold->flags & IOFLAGS_HAVE_IOFD) + iohandler_events(iold->data.iofd, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE)); + else + iold->data.callback(iold, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE)); + } } //check timers