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;
51 ngx_select_process_events,
79 if (event_index == NULL) {
80 FD_ZERO(&master_read_fd_set);
81 FD_ZERO(&master_write_fd_set);
132 "select add event fd:%d ev:%i", c->
fd, event);
136 "select event fd:%d ev:%i is already set", c->
fd, event);
144 "invalid select %s event fd:%d ev:%i",
145 ev->
write ?
"write" :
"read", c->
fd, event);
150 FD_SET(c->
fd, &master_read_fd_set);
153 FD_SET(c->
fd, &master_write_fd_set);
156 if (max_fd != -1 && max_fd < c->fd) {
162 event_index[nevents] = ev;
185 "select del event fd:%d ev:%i", c->
fd, event);
188 FD_CLR(c->
fd, &master_read_fd_set);
191 FD_CLR(c->
fd, &master_write_fd_set);
194 if (max_fd == c->
fd) {
198 if (ev->
index < --nevents) {
199 e = event_index[nevents];
200 event_index[ev->
index] = e;
218 struct timeval tv, *tp;
222 for (i = 0; i < nevents; i++) {
223 c = event_index[
i]->
data;
224 if (max_fd < c->fd) {
230 "change max_fd: %d", max_fd);
235 for (i = 0; i < nevents; i++) {
239 "select event: fd:%d wr:%d", c->
fd, ev->
write);
243 "max_fd: %d", max_fd);
251 tv.tv_sec = (long) (timer / 1000);
252 tv.tv_usec = (long) ((timer % 1000) * 1000);
257 "select timer: %M", timer);
259 work_read_fd_set = master_read_fd_set;
260 work_write_fd_set = master_write_fd_set;
262 ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp);
271 "select ready %d", ready);
292 ngx_select_repair_fd_sets(cycle);
304 "select() returned no events without timeout");
312 for (i = 0; i < nevents; i++) {
318 if (FD_ISSET(c->
fd, &work_write_fd_set)) {
321 "select write %d", c->
fd);
325 if (FD_ISSET(c->
fd, &work_read_fd_set)) {
328 "select read %d", c->
fd);
345 if (ready != nready) {
347 "select ready != events: %d:%d", ready, nready);
349 ngx_select_repair_fd_sets(cycle);
364 for (s = 0; s <= max_fd; s++) {
366 if (FD_ISSET(s, &master_read_fd_set) == 0) {
372 if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {
376 "invalid descriptor #%d in read fd_set", s);
378 FD_CLR(s, &master_read_fd_set);
382 for (s = 0; s <= max_fd; s++) {
384 if (FD_ISSET(s, &master_write_fd_set) == 0) {
390 if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {
394 "invalid descriptor #%d in write fd_set", s);
396 FD_CLR(s, &master_write_fd_set);
405 ngx_select_init_conf(
ngx_cycle_t *cycle,
void *conf)
419 "the maximum number of files "
420 "supported by select() is %ud", FD_SETSIZE);
427 "select() is not supported in the threaded mode");