21 static void ngx_select_repair_fd_sets(
ngx_cycle_t *cycle);
22 static char *ngx_select_init_conf(
ngx_cycle_t *cycle,
void *conf);
25 static fd_set master_read_fd_set;
26 static fd_set master_write_fd_set;
27 static fd_set work_read_fd_set;
28 static fd_set work_write_fd_set;
52 ngx_select_process_events,
80 if (event_index == NULL) {
81 FD_ZERO(&master_read_fd_set);
82 FD_ZERO(&master_write_fd_set);
134 "select add event fd:%d ev:%i", c->
fd, event);
138 "select event fd:%d ev:%i is already set", c->
fd, event);
146 "invalid select %s event fd:%d ev:%i",
147 ev->
write ?
"write" :
"read", c->
fd, event);
155 "maximum number of descriptors "
156 "supported by select() is %d", FD_SETSIZE);
161 FD_SET(c->
fd, &master_read_fd_set);
165 FD_SET(c->
fd, &master_write_fd_set);
171 event_index[nevents] = ev;
194 "select del event fd:%d ev:%i", c->
fd, event);
197 FD_CLR(c->
fd, &master_read_fd_set);
201 FD_CLR(c->
fd, &master_write_fd_set);
205 if (ev->
index < --nevents) {
206 e = event_index[nevents];
207 event_index[ev->
index] = e;
225 struct timeval tv, *tp;
230 for (i = 0; i < nevents; i++) {
234 "select event: fd:%d wr:%d", c->
fd, ev->
write);
243 tv.tv_sec = (long) (timer / 1000);
244 tv.tv_usec = (long) ((timer % 1000) * 1000);
249 "select timer: %M", timer);
251 work_read_fd_set = master_read_fd_set;
252 work_write_fd_set = master_write_fd_set;
254 if (max_read || max_write) {
255 ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);
277 "select ready %d", ready);
282 if (err == WSAENOTSOCK) {
283 ngx_select_repair_fd_sets(cycle);
295 "select() returned no events without timeout");
303 for (i = 0; i < nevents; i++) {
309 if (FD_ISSET(c->
fd, &work_write_fd_set)) {
312 "select write %d", c->
fd);
316 if (FD_ISSET(c->
fd, &work_read_fd_set)) {
319 "select read %d", c->
fd);
336 if (ready != nready) {
338 "select ready != events: %d:%d", ready, nready);
340 ngx_select_repair_fd_sets(cycle);
356 for (i = 0; i < master_read_fd_set.fd_count; i++) {
358 s = master_read_fd_set.fd_array[
i];
361 if (getsockopt(s, SOL_SOCKET, SO_TYPE, (
char *) &n, &len) == -1) {
365 "invalid descriptor #%d in read fd_set", s);
367 FD_CLR(s, &master_read_fd_set);
371 for (i = 0; i < master_write_fd_set.fd_count; i++) {
373 s = master_write_fd_set.fd_array[
i];
376 if (getsockopt(s, SOL_SOCKET, SO_TYPE, (
char *) &n, &len) == -1) {
380 "invalid descriptor #%d in write fd_set", s);
382 FD_CLR(s, &master_write_fd_set);
389 ngx_select_init_conf(
ngx_cycle_t *cycle,
void *conf)