aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/pty_process.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-02-26 23:29:08 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-03-24 10:56:42 -0300
commita6fb511c7f20d14dac692418a5c2a3e81615a63d (patch)
tree64db8d795e240271ced605bd70111380fcb7182a /src/nvim/os/pty_process.c
parent0c6fdd52513e643a74ebde99a92389492f4150f5 (diff)
downloadrneovim-a6fb511c7f20d14dac692418a5c2a3e81615a63d.tar.gz
rneovim-a6fb511c7f20d14dac692418a5c2a3e81615a63d.tar.bz2
rneovim-a6fb511c7f20d14dac692418a5c2a3e81615a63d.zip
job: Fix process cleanup using SIGCHLD/waitpid
Add a SIGCHLD handler for cleaning up pty processes passing the WNOHANG flag. It may also be used to cleanup processes spawned with uv_spawn.
Diffstat (limited to 'src/nvim/os/pty_process.c')
-rw-r--r--src/nvim/os/pty_process.c32
1 files changed, 0 insertions, 32 deletions
diff --git a/src/nvim/os/pty_process.c b/src/nvim/os/pty_process.c
index c135efc6d3..9a2721f769 100644
--- a/src/nvim/os/pty_process.c
+++ b/src/nvim/os/pty_process.c
@@ -34,7 +34,6 @@
typedef struct {
struct winsize winsize;
uv_pipe_t proc_stdin, proc_stdout, proc_stderr;
- uv_signal_t schld;
int tty_fd;
} PtyProcess;
@@ -136,9 +135,6 @@ bool pty_process_spawn(Job *job) FUNC_ATTR_NONNULL_ALL
goto error;
}
- uv_signal_init(uv_default_loop(), &ptyproc->schld);
- uv_signal_start(&ptyproc->schld, chld_handler, SIGCHLD);
- ptyproc->schld.data = job;
ptyproc->tty_fd = master;
job->pid = pid;
return true;
@@ -162,9 +158,6 @@ error:
void pty_process_close(Job *job) FUNC_ATTR_NONNULL_ALL
{
- PtyProcess *ptyproc = job->process;
- uv_signal_stop(&ptyproc->schld);
- uv_close((uv_handle_t *)&ptyproc->schld, NULL);
pty_process_close_master(job);
job_close_streams(job);
job_decref(job);
@@ -207,31 +200,6 @@ static void init_child(Job *job) FUNC_ATTR_NONNULL_ALL
fprintf(stderr, "execvp failed: %s\n", strerror(errno));
}
-static void chld_handler(uv_signal_t *handle, int signum) FUNC_ATTR_NONNULL_ALL
-{
- Job *job = handle->data;
- int stat = 0;
-
- if (waitpid(job->pid, &stat, 0) < 0) {
- fprintf(stderr, "Waiting for pid %d failed: %s\n", job->pid,
- strerror(errno));
- return;
- }
-
- if (WIFSTOPPED(stat) || WIFCONTINUED(stat)) {
- // Did not exit
- return;
- }
-
- if (WIFEXITED(stat)) {
- job->status = WEXITSTATUS(stat);
- } else if (WIFSIGNALED(stat)) {
- job->status = WTERMSIG(stat);
- }
-
- pty_process_close(job);
-}
-
static void init_termios(struct termios *termios) FUNC_ATTR_NONNULL_ALL
{
memset(termios, 0, sizeof(struct termios));