7 #define EPOLLRDHUP 0x2000
10 static void handle(Socket
*s
, int events
);
15 static int ival
; // ms
19 sockinit(Handle f
, void *x
, int64 ns
)
24 epfd
= epoll_create(1);
26 twarn("epoll_create");
33 sockwant(Socket
*s
, int rw
)
36 struct epoll_event ev
= {};
38 if (!s
->added
&& !rw
) {
40 } else if (!s
->added
&& rw
) {
57 ev
.events
|= EPOLLRDHUP
| EPOLLPRI
;
60 return epoll_ctl(epfd
, op
, s
->fd
, &ev
);
68 int64 e
, t
= nanoseconds();
69 struct epoll_event evs
[n
];
72 r
= epoll_wait(epfd
, evs
, n
, ival
);
73 if (r
== -1 && errno
!= EINTR
) {
80 if ((e
-t
) / 1000000 > ival
) {
86 handle(evs
[i
].data
.ptr
, evs
[i
].events
);
94 handle(Socket
*s
, int evset
)
98 if (evset
& (EPOLLHUP
|EPOLLRDHUP
)) {
100 } else if (evset
& EPOLLIN
) {
102 } else if (evset
& EPOLLOUT
) {