nxt_devpoll_engine.c (277:6baa1731cc6f) nxt_devpoll_engine.c (564:762f8c976ead)
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) {
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);
133 goto fail;
134 }
135
136 nxt_debug(&engine->task, "open(\"/dev/poll\"): %d", engine->u.devpoll.fd);
137
138 return NXT_OK;
139
140fail:

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

150{
151 nxt_fd_t fd;
152
153 fd = engine->u.devpoll.fd;
154
155 nxt_debug(&engine->task, "devpoll %d free", fd);
156
157 if (fd != -1 && close(fd) != 0) {
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);
160 }
161
162 nxt_free(engine->u.devpoll.events);
163 nxt_free(engine->u.devpoll.write_changes);
164 nxt_free(engine->u.devpoll.changes);
165 nxt_fd_event_hash_destroy(&engine->u.devpoll.fd_hash);
166
167 nxt_memzero(&engine->u.devpoll, sizeof(nxt_devpoll_engine_t));

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

510 engine->u.devpoll.fd, fd, n);
511
512 if (n == 0) {
513 /* The file descriptor is not in the set. */
514 return;
515 }
516
517 if (n == -1) {
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);
521 /* Fall through. */
522 }
523
524 /* n == 1: the file descriptor is in the set. */
525
526 nxt_debug(&engine->task, "devpoll %d remove fd:%d",
527 engine->u.devpoll.fd, fd);
528

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

544 nxt_debug(&engine->task, "devpoll write(%d) changes:%uz", fd, n);
545
546 n *= sizeof(struct pollfd);
547
548 if (nxt_slow_path(write(fd, pfd, n) == (ssize_t) n)) {
549 return NXT_OK;
550 }
551
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);
554
555 return NXT_ERROR;
556}
557
558
559static void
560nxt_devpoll_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)
561{

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

587 err = (nevents == -1) ? nxt_errno : 0;
588
589 nxt_thread_time_update(engine->task.thread);
590
591 nxt_debug(&engine->task, "ioctl(%d, DP_POLL): %d",
592 engine->u.devpoll.fd, nevents);
593
594 if (nevents == -1) {
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;
596
597 nxt_log(&engine->task, level, "ioctl(%d, DP_POLL) failed %E",
598 engine->u.devpoll.fd, err);
599
600 return;
601 }
602
603 for (i = 0; i < nevents; i++) {
604
605 pfd = &engine->u.devpoll.events[i];
606 fd = pfd->fd;
607 events = pfd->revents;
608
609 ev = nxt_fd_event_hash_get(&engine->task, &engine->u.devpoll.fd_hash,
610 fd);
611
612 if (nxt_slow_path(ev == NULL)) {
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);
617
618 nxt_devpoll_remove(engine, fd);
619 continue;
620 }
621
622 nxt_debug(ev->task, "devpoll: fd:%d ev:%04uXi rd:%d wr:%d",
623 fd, events, ev->read, ev->write);
624
625 if (nxt_slow_path(events & (POLLERR | POLLHUP | POLLNVAL)) != 0) {
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);
629
630 nxt_work_queue_add(&engine->fast_work_queue, ev->error_handler,
631 ev->task, ev, ev->data);
632 continue;
633 }
634
635 if (events & POLLIN) {
636 ev->read_ready = 1;

--- 29 unchanged lines hidden ---
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 ---