X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FIOEngine_epoll.c;h=d1c139f6970f734a4fdb65ef2b9d5dde12e50e30;hp=19c62272518c29804a26a41221577afba0b2d0eb;hb=259cd63d66c9870dc57aac7c34ef9b2033d9daf0;hpb=d80ff9e6b878be4f29854f4fe99f59efeb5e6e10 diff --git a/src/IOEngine_epoll.c b/src/IOEngine_epoll.c index 19c6227..d1c139f 100644 --- a/src/IOEngine_epoll.c +++ b/src/IOEngine_epoll.c @@ -55,6 +55,10 @@ static void engine_epoll_remove(struct IODescriptor *iofd) { static void engine_epoll_update(struct IODescriptor *iofd) { if(iofd->type == IOTYPE_TIMER) return; + if(iofd->state == IO_CLOSED) { + engine_epoll_remove(iofd); + return; + } struct epoll_event evt; int res; @@ -79,8 +83,14 @@ static void engine_epoll_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--; @@ -116,8 +126,14 @@ static void engine_epoll_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;