X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fmtio.c;h=e4166f5aab877b03fc32abbeac8b1bb1e8ffa3f8;hb=470938bdc9149ae9c7befd0cd983f46fcc056192;hp=b65a8b094840f435ce076886a9b3c39718af065b;hpb=5ab220d943a861df1d8546a3ecebfddbd63494a2;p=ashd.git diff --git a/lib/mtio.c b/lib/mtio.c index b65a8b0..e4166f5 100644 --- a/lib/mtio.c +++ b/lib/mtio.c @@ -176,10 +176,11 @@ void ioloop(void) { struct blocker *bl, *nbl; struct epoll_event evr[16]; - int i, fd, nev, ev; + int i, fd, nev, ev, toval; time_t now, timeout; epfd = epoll_create(128); + fcntl(epfd, F_SETFD, FD_CLOEXEC); for(bl = blockers; bl; bl = nbl) { nbl = bl->n; if(regfd(bl)) @@ -192,7 +193,13 @@ void ioloop(void) timeout = bl->to; } now = time(NULL); - nev = epoll_wait(epfd, evr, sizeof(evr) / sizeof(*evr), timeout?((timeout - now) * 1000):-1); + if(timeout == 0) + toval = -1; + else if(timeout > now) + toval = (timeout - now) * 1000; + else + toval = 1000; + nev = epoll_wait(epfd, evr, sizeof(evr) / sizeof(*evr), toval); if(nev < 0) { if(errno != EINTR) { flog(LOG_CRIT, "ioloop: select errored out: %s", strerror(errno)); @@ -202,7 +209,6 @@ void ioloop(void) } continue; } - now = time(NULL); for(i = 0; i < nev; i++) { fd = evr[i].data.fd; ev = 0; @@ -216,10 +222,14 @@ void ioloop(void) nbl = bl->n2; if((ev < 0) || (ev & bl->ev)) resume(bl->th, ev); - else if((bl->to != 0) && (bl->to <= now)) - resume(bl->th, 0); } } + now = time(NULL); + for(bl = blockers; bl; bl = nbl) { + nbl = bl->n; + if((bl->to != 0) && (bl->to <= now)) + resume(bl->th, 0); + } } close(epfd); epfd = -1;