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 }