diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/buffer.c | 2 | ||||
| -rw-r--r-- | src/nvim/event/process.c | 22 | ||||
| -rw-r--r-- | src/nvim/event/process.h | 3 | ||||
| -rw-r--r-- | src/nvim/terminal.c | 10 | 
4 files changed, 24 insertions, 13 deletions
| diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 7def8c1684..fe80f7f62e 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -449,7 +449,7 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last)    if (buf->terminal) {      terminal_close(buf->terminal, NULL); -  }  +  }    /* Always remove the buffer when there is no file name. */    if (buf->b_ffname == NULL) diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c index 6aab7d903c..ffda10a494 100644 --- a/src/nvim/event/process.c +++ b/src/nvim/event/process.c @@ -20,9 +20,9 @@  # include "event/process.c.generated.h"  #endif -// Time for a process to exit cleanly before we send KILL. -#define KILL_TIMEOUT_MS 2000 -#define KILL_TIMEOUT_NS (KILL_TIMEOUT_MS * 1000000) +// Time (ns) for a process to exit cleanly before we send TERM/KILL. +#define TERM_TIMEOUT 1000000000 +#define KILL_TIMEOUT (TERM_TIMEOUT * 2)  #define CLOSE_PROC_STREAM(proc, stream) \    do { \ @@ -121,6 +121,8 @@ void process_teardown(Loop *loop) FUNC_ATTR_NONNULL_ALL        // Close handles to process without killing it.        CREATE_EVENT(loop->events, process_close_handles, 1, proc);      } else { +      uv_kill(proc->pid, SIGTERM); +      proc->term_sent = true;        process_stop(proc);      }    } @@ -242,16 +244,12 @@ void process_stop(Process *proc) FUNC_ATTR_NONNULL_ALL        abort();    } -  ILOG("Sending SIGTERM to pid %d", proc->pid); -  uv_kill(proc->pid, SIGTERM); -    Loop *loop = proc->loop;    if (!loop->children_stop_requests++) {      // When there's at least one stop request pending, start a timer that -    // will periodically check if a signal should be send to the job. +    // will periodically check if a signal should be send to a to the job      DLOG("Starting job kill timer"); -    uv_timer_start(&loop->children_kill_timer, children_kill_cb, -                   KILL_TIMEOUT_MS, 100); +    uv_timer_start(&loop->children_kill_timer, children_kill_cb, 100, 100);    }  } @@ -269,7 +267,11 @@ static void children_kill_cb(uv_timer_t *handle)      }      uint64_t elapsed = now - proc->stopped_time; -    if (elapsed >= KILL_TIMEOUT_NS) { +    if (!proc->term_sent && elapsed >= TERM_TIMEOUT) { +      ILOG("Sending SIGTERM to pid %d", proc->pid); +      uv_kill(proc->pid, SIGTERM); +      proc->term_sent = true; +    } else if (elapsed >= KILL_TIMEOUT) {        ILOG("Sending SIGKILL to pid %d", proc->pid);        uv_kill(proc->pid, SIGKILL);      } diff --git a/src/nvim/event/process.h b/src/nvim/event/process.h index 5c00e8e7ec..26d70a5e6d 100644 --- a/src/nvim/event/process.h +++ b/src/nvim/event/process.h @@ -26,7 +26,7 @@ struct process {    Stream *in, *out, *err;    process_exit_cb cb;    internal_process_cb internal_exit_cb, internal_close_cb; -  bool closed, detach; +  bool closed, term_sent, detach;    MultiQueue *events;  }; @@ -48,6 +48,7 @@ static inline Process process_init(Loop *loop, ProcessType type, void *data)      .err = NULL,      .cb = NULL,      .closed = false, +    .term_sent = false,      .internal_close_cb = NULL,      .internal_exit_cb = NULL,      .detach = false diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index c44fe15be5..cc1de583d3 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -302,8 +302,16 @@ void terminal_close(Terminal *term, char *msg)    }    term->forward_mouse = false; -  term->closed = true; + +  // flush any pending changes to the buffer +  if (!exiting) { +    block_autocmds(); +    refresh_terminal(term); +    unblock_autocmds(); +  } +    buf_T *buf = handle_get_buffer(term->buf_handle); +  term->closed = true;    if (!msg || exiting) {      // If no msg was given, this was called by close_buffer(buffer.c).  Or if | 
