13 #if (NGX_TEST_BUILD_DEVPOLL)
17 #define POLLREMOVE 0x0800
18 #define DP_POLL 0xD001
19 #define DP_ISPOLLED 0xD002
22 struct pollfd *dp_fds;
47 static void *ngx_devpoll_create_conf(
ngx_cycle_t *cycle);
48 static char *ngx_devpoll_init_conf(
ngx_cycle_t *cycle,
void *conf);
51 static struct pollfd *change_list, *event_list;
52 static ngx_uint_t nchanges, max_changes, nevents;
81 ngx_devpoll_create_conf,
82 ngx_devpoll_init_conf,
85 ngx_devpoll_add_event,
86 ngx_devpoll_del_event,
87 ngx_devpoll_add_event,
88 ngx_devpoll_del_event,
92 ngx_devpoll_process_events,
102 ngx_devpoll_commands,
124 dp = open(
"/dev/poll", O_RDWR);
128 "open(/dev/poll) failed");
133 if (max_changes < dpcf->changes) {
135 n = nchanges *
sizeof(
struct pollfd);
136 if (write(dp, change_list, n) != (ssize_t) n) {
138 "write(/dev/poll) failed");
151 if (change_list == NULL) {
161 if (change_index == NULL) {
168 if (nevents < dpcf->events) {
175 if (event_list == NULL) {
195 if (close(dp) == -1) {
197 "close(/dev/poll) failed");
222 #if (NGX_READ_EVENT != POLLIN)
229 "devpoll add event: fd:%d ev:%04Xi", c->
fd, event);
234 return ngx_devpoll_set_event(ev, event, 0);
246 #if (NGX_READ_EVENT != POLLIN)
251 "devpoll del event: fd:%d ev:%04Xi", c->
fd, event);
253 if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) ==
NGX_ERROR) {
260 e = (
event == POLLIN) ? c->
write : c->
read;
271 if (event == POLLIN) {
281 return ngx_devpoll_set_event(e, event, 0);
297 "devpoll fd:%d ev:%04Xi fl:%04Xi", c->
fd, event, flags);
299 if (nchanges >= max_changes) {
301 "/dev/pool change list is filled up");
303 n = nchanges *
sizeof(
struct pollfd);
304 if (write(dp, change_list, n) != (ssize_t) n) {
306 "write(/dev/poll) failed");
313 change_list[nchanges].fd = c->
fd;
314 change_list[nchanges].events = (short) event;
315 change_list[nchanges].revents = 0;
317 change_index[nchanges] = ev;
318 ev->
index = nchanges;
322 if (flags & NGX_CLOSE_EVENT) {
323 n = nchanges *
sizeof(
struct pollfd);
324 if (write(dp, change_list, n) != (ssize_t) n) {
326 "write(/dev/poll) failed");
341 int events, revents, rc;
355 "devpoll timer: %M", timer);
358 n = nchanges *
sizeof(
struct pollfd);
359 if (write(dp, change_list, n) != (ssize_t) n) {
361 "write(/dev/poll) failed");
368 dvp.dp_fds = event_list;
369 dvp.dp_nfds = (int) nevents;
370 dvp.dp_timeout = timer;
371 events = ioctl(dp, DP_POLL, &dvp);
403 "ioctl(DP_POLL) returned no events without timeout");
409 for (i = 0; i < events; i++) {
411 fd = event_list[
i].fd;
412 revents = event_list[
i].revents;
416 if (c == NULL || c->
fd == -1) {
422 rc = ioctl(dp, DP_ISPOLLED, &pfd);
428 "ioctl(DP_ISPOLLED) failed for socket %d, event",
434 "phantom event %04Xd for closed and removed socket %d",
440 "unexpected event %04Xd for closed and removed socket %d, ",
441 "ioctl(DP_ISPOLLED) returned rc:%d, fd:%d, event %04Xd",
442 revents, fd, rc, pfd.fd, pfd.revents);
445 pfd.events = POLLREMOVE;
448 if (write(dp, &pfd,
sizeof(
struct pollfd))
449 != (ssize_t)
sizeof(
struct pollfd))
452 "write(/dev/poll) for %d failed, fd");
455 if (close(fd) == -1) {
457 "close(%d) failed", fd);
467 "devpoll: fd:%d, ev:%04Xd, rev:%04Xd",
468 fd, event_list[i].events, revents);
470 if (revents & (POLLERR|POLLHUP|POLLNVAL)) {
472 "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd",
473 fd, event_list[i].events, revents);
476 if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {
478 "strange ioctl(DP_POLL) events "
479 "fd:%d ev:%04Xd rev:%04Xd",
480 fd, event_list[i].events, revents);
483 if ((revents & (POLLERR|POLLHUP|POLLNVAL))
484 && (revents & (POLLIN|POLLOUT)) == 0)
492 revents |= POLLIN|POLLOUT;
497 if ((revents & POLLIN) && rev->
active) {
517 if (c->
fd == -1 || rev->
instance != instance) {
525 if ((revents & POLLOUT) && wev->
active) {
527 if (flags & NGX_POST_THREAD_EVENTS) {
534 if (flags & NGX_POST_EVENTS) {
567 ngx_devpoll_init_conf(
ngx_cycle_t *cycle,
void *conf)