Moving file descriptor blocking to libunit.

The default libunit behavior relies on blocking the recv() call for port file
descriptors, which an application may override if needed.  For external
applications, port file descriptors were toggled to blocking mode before the
exec() call.  If the exec() call failed, descriptor remained blocked, so the
process hanged while trying to read from it.

This patch moves file descriptor mode switch inside libunit.
This commit is contained in:
Max Romanov
2020-08-11 21:48:16 +03:00
parent 8cf522bf2d
commit acb0cca49d
3 changed files with 39 additions and 19 deletions

View File

@@ -1290,8 +1290,6 @@ nxt_unit_default_init(nxt_task_t *task, nxt_unit_init_t *init)
init->ready_port.in_fd = -1;
init->ready_port.out_fd = main_port->pair[1];
nxt_fd_blocking(task, main_port->pair[1]);
init->ready_stream = my_port->process->stream;
init->router_port.id.pid = router_port->pid;
@@ -1299,15 +1297,11 @@ nxt_unit_default_init(nxt_task_t *task, nxt_unit_init_t *init)
init->router_port.in_fd = -1;
init->router_port.out_fd = router_port->pair[1];
nxt_fd_blocking(task, router_port->pair[1]);
init->read_port.id.pid = my_port->pid;
init->read_port.id.id = my_port->id;
init->read_port.in_fd = my_port->pair[0];
init->read_port.out_fd = -1;
nxt_fd_blocking(task, my_port->pair[0]);
init->log_fd = 2;
return NXT_OK;