Properly round event timeout for the epoll driver.

Avoids continuous 0 msec timeouts just before timers expire.
This commit is contained in:
Sönke Ludwig 2016-06-15 22:17:34 +02:00
parent 80df8e1ce8
commit 96a8c95b81

View file

@ -34,11 +34,12 @@ final class EpollEventDriver : PosixEventDriver {
import std.algorithm : min; import std.algorithm : min;
//assert(Fiber.getThis() is null, "processEvents may not be called from within a fiber!"); //assert(Fiber.getThis() is null, "processEvents may not be called from within a fiber!");
auto ts = timeout.toTimeVal;
//print("wait %s", m_events.length); //print("wait %s", m_events.length);
auto ret = epoll_wait(m_epoll, m_events.ptr, cast(int)m_events.length, timeout == Duration.max ? -1 : cast(int)min(timeout.total!"msecs", int.max)); long tomsec;
//print("wait done %s", ret); if (timeout == Duration.max) tomsec = long.max;
else tomsec = (timeout.total!"hnsecs" + 9999) / 10_000;
auto ret = epoll_wait(m_epoll, m_events.ptr, cast(int)m_events.length, tomsec > int.max ? -1 : cast(int)tomsec);
print("wait done %s", ret);
if (ret > 0) { if (ret > 0) {
foreach (ref evt; m_events[0 .. ret]) { foreach (ref evt; m_events[0 .. ret]) {