20 static int fdevent_select_reset(fdevents
*ev
) {
21 FD_ZERO(&(ev
->select_set_read
));
22 FD_ZERO(&(ev
->select_set_write
));
23 FD_ZERO(&(ev
->select_set_error
));
24 ev
->select_max_fd
= -1;
29 static int fdevent_select_event_del(fdevents
*ev
, int fde_ndx
, int fd
) {
30 if (fde_ndx
< 0) return -1;
32 FD_CLR(fd
, &(ev
->select_set_read
));
33 FD_CLR(fd
, &(ev
->select_set_write
));
34 FD_CLR(fd
, &(ev
->select_set_error
));
39 static int fdevent_select_event_set(fdevents
*ev
, int fde_ndx
, int fd
, int events
) {
42 /* we should be protected by max-fds, but you never know */
43 force_assert(fd
< ((int)FD_SETSIZE
));
45 if (events
& FDEVENT_IN
) {
46 FD_SET(fd
, &(ev
->select_set_read
));
48 FD_CLR(fd
, &(ev
->select_set_read
));
50 if (events
& FDEVENT_OUT
) {
51 FD_SET(fd
, &(ev
->select_set_write
));
53 FD_CLR(fd
, &(ev
->select_set_write
));
55 FD_SET(fd
, &(ev
->select_set_error
));
57 if (fd
> ev
->select_max_fd
) ev
->select_max_fd
= fd
;
62 static int fdevent_select_poll(fdevents
*ev
, int timeout_ms
) {
65 tv
.tv_sec
= timeout_ms
/ 1000;
66 tv
.tv_usec
= (timeout_ms
% 1000) * 1000;
68 ev
->select_read
= ev
->select_set_read
;
69 ev
->select_write
= ev
->select_set_write
;
70 ev
->select_error
= ev
->select_set_error
;
72 return select(ev
->select_max_fd
+ 1, &(ev
->select_read
), &(ev
->select_write
), &(ev
->select_error
), &tv
);
75 static int fdevent_select_event_get_revent(fdevents
*ev
, size_t ndx
) {
78 if (FD_ISSET(ndx
, &(ev
->select_read
))) {
79 revents
|= FDEVENT_IN
;
81 if (FD_ISSET(ndx
, &(ev
->select_write
))) {
82 revents
|= FDEVENT_OUT
;
84 if (FD_ISSET(ndx
, &(ev
->select_error
))) {
85 revents
|= FDEVENT_ERR
;
91 static int fdevent_select_event_get_fd(fdevents
*ev
, size_t ndx
) {
97 static int fdevent_select_event_next_fdndx(fdevents
*ev
, int ndx
) {
100 i
= (ndx
< 0) ? 0 : ndx
+ 1;
102 for (; i
< ev
->select_max_fd
+ 1; i
++) {
103 if (FD_ISSET(i
, &(ev
->select_read
))) return i
;
104 if (FD_ISSET(i
, &(ev
->select_write
))) return i
;
105 if (FD_ISSET(i
, &(ev
->select_error
))) return i
;
111 int fdevent_select_init(fdevents
*ev
) {
112 ev
->type
= FDEVENT_HANDLER_SELECT
;
114 ev->x = fdevent_select_##x;
122 SET(event_next_fdndx
);
124 SET(event_get_revent
);
130 int fdevent_select_init(fdevents
*ev
) {