1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 114 unchanged lines hidden (view full) ---

123 engine->u.devpoll.events = nxt_malloc(sizeof(struct pollfd) * mevents);
124 if (engine->u.devpoll.events == NULL) {
125 goto fail;
126 }
127
128 engine->u.devpoll.fd = open("/dev/poll", O_RDWR);
129
130 if (engine->u.devpoll.fd == -1) {
131 nxt_log(&engine->task, NXT_LOG_CRIT, "open(\"/dev/poll\") failed %E",
132 nxt_errno);
131 nxt_alert(&engine->task, "open(\"/dev/poll\") failed %E", nxt_errno);
132 goto fail;
133 }
134
135 nxt_debug(&engine->task, "open(\"/dev/poll\"): %d", engine->u.devpoll.fd);
136
137 return NXT_OK;
138
139fail:

--- 9 unchanged lines hidden (view full) ---

149{
150 nxt_fd_t fd;
151
152 fd = engine->u.devpoll.fd;
153
154 nxt_debug(&engine->task, "devpoll %d free", fd);
155
156 if (fd != -1 && close(fd) != 0) {
158 nxt_log(&engine->task, NXT_LOG_CRIT, "devpoll close(%d) failed %E",
159 fd, nxt_errno);
157 nxt_alert(&engine->task, "devpoll close(%d) failed %E", fd, nxt_errno);
158 }
159
160 nxt_free(engine->u.devpoll.events);
161 nxt_free(engine->u.devpoll.write_changes);
162 nxt_free(engine->u.devpoll.changes);
163 nxt_fd_event_hash_destroy(&engine->u.devpoll.fd_hash);
164
165 nxt_memzero(&engine->u.devpoll, sizeof(nxt_devpoll_engine_t));

--- 342 unchanged lines hidden (view full) ---

508 engine->u.devpoll.fd, fd, n);
509
510 if (n == 0) {
511 /* The file descriptor is not in the set. */
512 return;
513 }
514
515 if (n == -1) {
518 nxt_log(&engine->task, NXT_LOG_CRIT,
519 "ioctl(%d, DP_ISPOLLED, %d) failed %E",
520 engine->u.devpoll.fd, fd, nxt_errno);
516 nxt_alert(&engine->task, "ioctl(%d, DP_ISPOLLED, %d) failed %E",
517 engine->u.devpoll.fd, fd, nxt_errno);
518 /* Fall through. */
519 }
520
521 /* n == 1: the file descriptor is in the set. */
522
523 nxt_debug(&engine->task, "devpoll %d remove fd:%d",
524 engine->u.devpoll.fd, fd);
525

--- 15 unchanged lines hidden (view full) ---

541 nxt_debug(&engine->task, "devpoll write(%d) changes:%uz", fd, n);
542
543 n *= sizeof(struct pollfd);
544
545 if (nxt_slow_path(write(fd, pfd, n) == (ssize_t) n)) {
546 return NXT_OK;
547 }
548
552 nxt_log(&engine->task, NXT_LOG_CRIT, "devpoll write(%d) failed %E",
553 fd, nxt_errno);
549 nxt_alert(&engine->task, "devpoll write(%d) failed %E", fd, nxt_errno);
550
551 return NXT_ERROR;
552}
553
554
555static void
556nxt_devpoll_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)
557{

--- 25 unchanged lines hidden (view full) ---

583 err = (nevents == -1) ? nxt_errno : 0;
584
585 nxt_thread_time_update(engine->task.thread);
586
587 nxt_debug(&engine->task, "ioctl(%d, DP_POLL): %d",
588 engine->u.devpoll.fd, nevents);
589
590 if (nevents == -1) {
595 level = (err == NXT_EINTR) ? NXT_LOG_INFO : NXT_LOG_CRIT;
591 level = (err == NXT_EINTR) ? NXT_LOG_INFO : NXT_LOG_ALERT;
592
593 nxt_log(&engine->task, level, "ioctl(%d, DP_POLL) failed %E",
594 engine->u.devpoll.fd, err);
595
596 return;
597 }
598
599 for (i = 0; i < nevents; i++) {
600
601 pfd = &engine->u.devpoll.events[i];
602 fd = pfd->fd;
603 events = pfd->revents;
604
605 ev = nxt_fd_event_hash_get(&engine->task, &engine->u.devpoll.fd_hash,
606 fd);
607
608 if (nxt_slow_path(ev == NULL)) {
613 nxt_log(&engine->task, NXT_LOG_CRIT,
614 "ioctl(%d, DP_POLL) returned invalid "
615 "fd:%d ev:%04Xd rev:%04uXi",
616 engine->u.devpoll.fd, fd, pfd->events, events);
609 nxt_alert(&engine->task,
610 "ioctl(%d, DP_POLL) returned invalid "
611 "fd:%d ev:%04Xd rev:%04uXi",
612 engine->u.devpoll.fd, fd, pfd->events, events);
613
614 nxt_devpoll_remove(engine, fd);
615 continue;
616 }
617
618 nxt_debug(ev->task, "devpoll: fd:%d ev:%04uXi rd:%d wr:%d",
619 fd, events, ev->read, ev->write);
620
621 if (nxt_slow_path(events & (POLLERR | POLLHUP | POLLNVAL)) != 0) {
626 nxt_log(ev->task, NXT_LOG_CRIT,
627 "ioctl(%d, DP_POLL) error fd:%d ev:%04Xd rev:%04uXi",
628 engine->u.devpoll.fd, fd, pfd->events, events);
622 nxt_alert(ev->task,
623 "ioctl(%d, DP_POLL) error fd:%d ev:%04Xd rev:%04uXi",
624 engine->u.devpoll.fd, fd, pfd->events, events);
625
626 nxt_work_queue_add(&engine->fast_work_queue, ev->error_handler,
627 ev->task, ev, ev->data);
628 continue;
629 }
630
631 if (events & POLLIN) {
632 ev->read_ready = 1;

--- 29 unchanged lines hidden ---