1 module async.eventloop; 2 3 import std.stdio; 4 import std.socket; 5 import std.parallelism; 6 7 import async.event.selector; 8 import async.net.tcplistener; 9 10 version (Posix) 11 { 12 import core.sys.posix.signal; 13 } 14 15 version (linux) 16 { 17 import async.event.epoll; 18 } 19 else version (OSX) 20 { 21 import async.event.kqueue; 22 } 23 else version (iOS) 24 { 25 import async.event.kqueue; 26 } 27 else version (TVOS) 28 { 29 import async.event.kqueue; 30 } 31 else version (WatchOS) 32 { 33 import async.event.kqueue; 34 } 35 else version (FreeBSD) 36 { 37 import async.event.kqueue; 38 } 39 else version (OpenBSD) 40 { 41 import async.event.kqueue; 42 } 43 else version (DragonFlyBSD) 44 { 45 import async.event.kqueue; 46 } 47 else version (Windows) 48 { 49 import async.event.iocp; 50 } 51 else 52 { 53 static assert(false, "Unsupported platform."); 54 } 55 56 class EventLoop : LoopSelector 57 { 58 this(TcpListener listener, OnConnected onConnected, OnDisConnected onDisConnected, OnReceive onReceive, OnSendCompleted onSendCompleted, OnSocketError onSocketError, int workerThreadNum = totalCPUs) 59 { 60 version (Posix) 61 { 62 sigset_t mask1; 63 sigemptyset(&mask1); 64 sigaddset(&mask1, SIGPIPE); 65 sigaddset(&mask1, SIGILL); 66 sigprocmask(SIG_BLOCK, &mask1, null); 67 } 68 69 super(listener, onConnected, onDisConnected, onReceive, onSendCompleted, onSocketError, workerThreadNum); 70 } 71 72 void run() 73 { 74 writefln("Start listening to %s...", _listener.localAddress().toString()); 75 76 startLoop(); 77 } 78 }