X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FIOEngine_kevent.c;h=ee93f8645f09f63a25cb750df661d70b91c3d535;hp=21c81efcf421bb5fe2bace8b519b055813ba8964;hb=f83bd22fe2dcb3ca0ddb9321944ee0b9c9b61ea6;hpb=ff58997de5ecd501485f9214f4fbdc4766157b42 diff --git a/src/IOEngine_kevent.c b/src/IOEngine_kevent.c index 21c81ef..ee93f86 100644 --- a/src/IOEngine_kevent.c +++ b/src/IOEngine_kevent.c @@ -18,6 +18,7 @@ #ifdef HAVE_SYS_EVENT_H #include +#include #define MAX_EVENTS 32 @@ -44,7 +45,6 @@ static void engine_kevent_add(struct IODescriptor *iofd) { 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); - } } static void engine_kevent_remove(struct IODescriptor *iofd) { @@ -60,7 +60,7 @@ static void engine_kevent_remove(struct IODescriptor *iofd) { static void engine_kevent_update(struct IODescriptor *iofd) { if(iofd->type == IOTYPE_TIMER) return; if(iofd->state == IO_CLOSED) { - engine_epoll_remove(iofd); + engine_kevent_remove(iofd); return; } struct kevent changes[2]; @@ -77,11 +77,10 @@ static void engine_kevent_update(struct IODescriptor *iofd) { } static void engine_kevent_loop(struct timeval *timeout) { - struct kevent evts[MAX_EVENTS]; + struct kevent events[MAX_EVENTS]; struct timeval now, tdiff; - struct timespec ts, *ptr + struct timespec ts, *pts; int msec; - int events; int kevent_result; gettimeofday(&now, NULL); @@ -90,8 +89,14 @@ static void engine_kevent_loop(struct timeval *timeout) { tdiff.tv_sec = timer_priority->timeout.tv_sec - now.tv_sec; tdiff.tv_usec = timer_priority->timeout.tv_usec - now.tv_usec; if(tdiff.tv_sec < 0 || (tdiff.tv_sec == 0 && tdiff.tv_usec <= 0)) { - iohandler_events(timer_priority, 0, 0); - iohandler_close(timer_priority); //also sets timer_priority to the next timed element + if(timer_priority->constant_timeout) { + tdiff.tv_sec = 0; + iohandler_set_timeout(timer_priority, &tdiff); + iohandler_events(timer_priority, 0, 0); + } else { + iohandler_events(timer_priority, 0, 0); + iohandler_close(timer_priority); //also sets timer_priority to the next timed element + } continue; } else if(tdiff.tv_usec < 0) { tdiff.tv_sec--; @@ -113,7 +118,7 @@ static void engine_kevent_loop(struct timeval *timeout) { } //select system call - kevent_result = kevent(kq_fd, NULL, 0, events, MAX_EVENTS, pts); + kevent_result = kevent(kevent_fd, NULL, 0, events, MAX_EVENTS, pts); if (kevent_result < 0) { if (errno != EINTR) { @@ -123,7 +128,7 @@ static void engine_kevent_loop(struct timeval *timeout) { } else { int i; for(i = 0; i < kevent_result; i++) - iohandler_events(evts[i].udata, (evts[i].filter == EVFILT_READ), (evts[i].filter == EVFILT_WRITE)); + iohandler_events(events[i].udata, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE)); } //check timers @@ -131,8 +136,14 @@ static void engine_kevent_loop(struct timeval *timeout) { tdiff.tv_sec = timer_priority->timeout.tv_sec - now.tv_sec; tdiff.tv_usec = timer_priority->timeout.tv_usec - now.tv_usec; if(tdiff.tv_sec < 0 || (tdiff.tv_sec == 0 && tdiff.tv_usec <= 0)) { - iohandler_events(timer_priority, 0, 0); - iohandler_close(timer_priority); //also sets timer_priority to the next timed element + if(timer_priority->constant_timeout) { + tdiff.tv_sec = 0; + iohandler_set_timeout(timer_priority, &tdiff); + iohandler_events(timer_priority, 0, 0); + } else { + iohandler_events(timer_priority, 0, 0); + iohandler_close(timer_priority); //also sets timer_priority to the next timed element + } continue; } break;