/
select.d
104 lines (77 loc) · 2.44 KB
/
select.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
module evloop.select;
version (select):
import core.sys.posix.sys.select;
import evloop.base;
class SelectLoop : EvLoop
{
private bool isRun;
FDData[int] fds;
this()
{
isRun = true;
}
override
{
bool step()
{
fd_set read_set, write_set, err_set;
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_ZERO(&err_set);
int nfds = 0;
foreach (fd, data; fds)
{
//mlogf("SET %d %s", fd, data);
if (data.repeat == 0) continue;
if (data.read)
{
FD_SET(fd, &read_set);
if (fd > nfds) nfds = fd;
}
if (data.write)
{
FD_SET(fd, &write_set);
if (fd > nfds) nfds = fd;
}
FD_SET(fd, &err_set);
}
nfds++;
//mlog("SELECT");
check!select(nfds, &read_set, &write_set, &err_set, null);
//mlog(" SELECT FIN");
foreach (fd, data; fds)
{
const isread = FD_ISSET(fd, &read_set);
const iswrite = FD_ISSET(fd, &write_set);
const iserr = FD_ISSET(fd, &err_set);
const setted = isread || iswrite || iserr;
if (!setted) continue;
//mlogf("CHECK FD %d %s read(%s) write(%s) err(%s)",
// fd, data, isread, iswrite, iserr);
if (data.repeat == 0) continue;
if (data.repeat > 0) data.repeat--;
if (iserr)
{
(*data.cb)(EvType.ERR);
continue;
}
(*data.cb)( (isread ? EvType.READ : 0) |
(iswrite ? EvType.WRITE : 0) );
}
return isRun;
}
void stop() { isRun = false; }
void run() { while (step()) {} }
void addFD(int fd, FDData data) { fds[fd] = data; }
void modFD(int fd, FDData data) { fds[fd] = data; }
void delFD(int fd) { fds.remove(fd); }
Waker makeNewWaker(Worker w)
{ return new BaseWaker(w); }
Timer makeNewTimer(void delegate(Timer) fnc)
{
import evloop.linuxtimer;
return new LinuxTimer(fnc);
}
}
}
static this() { evl = new SelectLoop; }