Consume eventfd data to avoid the select based driver getting stuck.

This commit is contained in:
Sönke Ludwig 2016-06-18 08:11:34 +02:00
parent 6e1690e804
commit 208c9ab345

View file

@ -15,7 +15,7 @@ import std.socket : Address, AddressFamily, UnknownAddress;
version (Posix) { version (Posix) {
import core.sys.posix.netinet.in_; import core.sys.posix.netinet.in_;
import core.sys.posix.netinet.tcp; import core.sys.posix.netinet.tcp;
import core.sys.posix.unistd : close, write; import core.sys.posix.unistd : close, read, write;
import core.stdc.errno : errno, EAGAIN, EINPROGRESS; import core.stdc.errno : errno, EAGAIN, EINPROGRESS;
import core.sys.posix.fcntl; import core.sys.posix.fcntl;
} }
@ -535,6 +535,8 @@ abstract class PosixEventDriver : EventDriver {
private void onEvent(FD event) private void onEvent(FD event)
@trusted { @trusted {
ulong cnt;
() @trusted { read(event, &cnt, cnt.sizeof); } ();
import core.atomic : cas; import core.atomic : cas;
auto all = cas(&m_fds[event].triggerAll, true, false); auto all = cas(&m_fds[event].triggerAll, true, false);
triggerEvent(cast(EventID)event, all); triggerEvent(cast(EventID)event, all);