… | |
… | |
52 | #endif |
52 | #endif |
53 | |
53 | |
54 | #if EV_SELECT_IS_WINSOCKET |
54 | #if EV_SELECT_IS_WINSOCKET |
55 | # undef EV_SELECT_USE_FD_SET |
55 | # undef EV_SELECT_USE_FD_SET |
56 | # define EV_SELECT_USE_FD_SET 1 |
56 | # define EV_SELECT_USE_FD_SET 1 |
|
|
57 | # undef NFDBITS |
|
|
58 | # define NFDBITS 0 |
57 | #endif |
59 | #endif |
58 | |
60 | |
59 | #if !EV_SELECT_USE_FD_SET |
61 | #if !EV_SELECT_USE_FD_SET |
60 | # define NFDBYTES (NFDBITS / 8) |
62 | # define NFDBYTES (NFDBITS / 8) |
61 | #endif |
63 | #endif |
… | |
… | |
75 | SOCKET handle = anfds [fd].handle; |
77 | SOCKET handle = anfds [fd].handle; |
76 | #else |
78 | #else |
77 | int handle = fd; |
79 | int handle = fd; |
78 | #endif |
80 | #endif |
79 | |
81 | |
|
|
82 | /* FD_SET is broken on windows (it adds the fd to a set twice or more, |
|
|
83 | * which eventually leads to overflows). Need to call it only on changes. |
|
|
84 | */ |
|
|
85 | #if EV_SELECT_IS_WINSOCKET |
|
|
86 | if ((oev ^ nev) & EV_READ) |
|
|
87 | #endif |
80 | if (nev & EV_READ) |
88 | if (nev & EV_READ) |
81 | FD_SET (handle, (fd_set *)vec_ri); |
89 | FD_SET (handle, (fd_set *)vec_ri); |
82 | else |
90 | else |
83 | FD_CLR (handle, (fd_set *)vec_ri); |
91 | FD_CLR (handle, (fd_set *)vec_ri); |
84 | |
92 | |
|
|
93 | #if EV_SELECT_IS_WINSOCKET |
|
|
94 | if ((oev ^ nev) & EV_WRITE) |
|
|
95 | #endif |
85 | if (nev & EV_WRITE) |
96 | if (nev & EV_WRITE) |
86 | FD_SET (handle, (fd_set *)vec_wi); |
97 | FD_SET (handle, (fd_set *)vec_wi); |
87 | else |
98 | else |
88 | FD_CLR (handle, (fd_set *)vec_wi); |
99 | FD_CLR (handle, (fd_set *)vec_wi); |
89 | |
100 | |
90 | #else |
101 | #else |
91 | |
102 | |
92 | int word = fd / NFDBITS; |
103 | int word = fd / NFDBITS; |
93 | fd_mask mask = 1UL << (fd % NFDBITS); |
104 | fd_mask mask = 1UL << (fd % NFDBITS); |
… | |
… | |
223 | for (word = vec_max; word--; ) |
234 | for (word = vec_max; word--; ) |
224 | { |
235 | { |
225 | fd_mask word_r = ((fd_mask *)vec_ro) [word]; |
236 | fd_mask word_r = ((fd_mask *)vec_ro) [word]; |
226 | fd_mask word_w = ((fd_mask *)vec_wo) [word]; |
237 | fd_mask word_w = ((fd_mask *)vec_wo) [word]; |
227 | #ifdef _WIN32 |
238 | #ifdef _WIN32 |
228 | word_r |= ((fd_mask *)vec_eo) [word]; |
|
|
229 | word_w |= ((fd_mask *)vec_eo) [word]; |
239 | word_w |= ((fd_mask *)vec_eo) [word]; |
230 | #endif |
240 | #endif |
231 | |
241 | |
232 | if (word_r || word_w) |
242 | if (word_r || word_w) |
233 | for (bit = NFDBITS; bit--; ) |
243 | for (bit = NFDBITS; bit--; ) |