13 static void handle(Socket
*, int, int);
19 static struct timespec ivalts
;
23 sockinit(Handle f
, void *x
, int64 ns
)
28 ivalts
.tv_sec
= ns
/ 1000000000;
29 ivalts
.tv_nsec
= ns
% 1000000000;
39 sockwant(Socket
*s
, int rw
)
42 struct kevent evs
[2] = {}, *ev
= evs
;
43 struct timespec ts
= {};
47 ev
->filter
= s
->added
;
48 ev
->flags
= EV_DELETE
;
57 ev
->filter
= EVFILT_READ
;
60 ev
->filter
= EVFILT_WRITE
;
63 // check only for hangup
64 ev
->filter
= EVFILT_READ
;
65 ev
->fflags
= NOTE_LOWAT
;
70 s
->added
= ev
->filter
;
75 return kevent(kq
, evs
, n
, NULL
, 0, &ts
);
83 int64 e
, t
= nanoseconds();
87 r
= kevent(kq
, NULL
, 0, evs
, n
, &ivalts
);
88 if (r
== -1 && errno
!= EINTR
) {
100 for (i
=0; i
<r
; i
++) {
101 handle(evs
[i
].udata
, evs
[i
].filter
, evs
[i
].flags
);
109 handle(Socket
*s
, int filt
, int flags
)
111 if (filt
== EVFILT_READ
) {
113 } else if (filt
== EVFILT_WRITE
) {