Backout of ba94959b1dec and improving epoll error handling.
This commit is contained in:
@@ -920,8 +920,8 @@ nxt_epoll_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)
|
|||||||
ev->fd, events, ev, ev->read, ev->write);
|
ev->fd, events, ev, ev->read, ev->write);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On error epoll may set EPOLLERR and EPOLLHUP only without EPOLLIN or
|
* On error epoll may set EPOLLERR and EPOLLHUP only without EPOLLIN
|
||||||
* EPOLLOUT, so the "error" variable enqueues only one active handler.
|
* or EPOLLOUT, so the "error" variable enqueues only error handler.
|
||||||
*/
|
*/
|
||||||
error = ((events & (EPOLLERR | EPOLLHUP)) != 0);
|
error = ((events & (EPOLLERR | EPOLLHUP)) != 0);
|
||||||
ev->epoll_error = error;
|
ev->epoll_error = error;
|
||||||
@@ -932,7 +932,7 @@ nxt_epoll_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((events & EPOLLIN) || error) {
|
if ((events & EPOLLIN) != 0) {
|
||||||
ev->read_ready = 1;
|
ev->read_ready = 1;
|
||||||
|
|
||||||
if (ev->read != NXT_EVENT_BLOCKED) {
|
if (ev->read != NXT_EVENT_BLOCKED) {
|
||||||
@@ -948,9 +948,11 @@ nxt_epoll_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)
|
|||||||
/* Level-triggered mode. */
|
/* Level-triggered mode. */
|
||||||
nxt_epoll_disable_read(engine, ev);
|
nxt_epoll_disable_read(engine, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((events & EPOLLOUT) || error) {
|
if ((events & EPOLLOUT) != 0) {
|
||||||
ev->write_ready = 1;
|
ev->write_ready = 1;
|
||||||
|
|
||||||
if (ev->write != NXT_EVENT_BLOCKED) {
|
if (ev->write != NXT_EVENT_BLOCKED) {
|
||||||
@@ -966,7 +968,29 @@ nxt_epoll_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)
|
|||||||
/* Level-triggered mode. */
|
/* Level-triggered mode. */
|
||||||
nxt_epoll_disable_write(engine, ev);
|
nxt_epoll_disable_write(engine, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!error) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ev->read_ready = 1;
|
||||||
|
ev->write_ready = 1;
|
||||||
|
|
||||||
|
if (ev->read == NXT_EVENT_BLOCKED && ev->write == NXT_EVENT_BLOCKED) {
|
||||||
|
|
||||||
|
if (engine->u.epoll.mode == 0) {
|
||||||
|
/* Level-triggered mode. */
|
||||||
|
nxt_epoll_disable(engine, ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxt_work_queue_add(&engine->fast_work_queue, nxt_epoll_error_handler,
|
||||||
|
ev->task, ev, ev->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user