aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-09-10 14:11:12 +0200
committerGitHub <noreply@github.com>2016-09-10 14:11:12 +0200
commitbccb49bedb9b5fe0a3635e2be4aa2d168c5d3051 (patch)
tree1aee89bcf13cdb28351d2ff2648db197c9c7f679
parentfe06e2a4a076d698e921411608d7a6cbe8877175 (diff)
parentf8a8a569081a8b8eadb74d040179dca9fb85af60 (diff)
downloadrneovim-bccb49bedb9b5fe0a3635e2be4aa2d168c5d3051.tar.gz
rneovim-bccb49bedb9b5fe0a3635e2be4aa2d168c5d3051.tar.bz2
rneovim-bccb49bedb9b5fe0a3635e2be4aa2d168c5d3051.zip
Merge #5316
-rw-r--r--src/nvim/eval.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 211419f7a6..ce04739ee4 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -21765,9 +21765,15 @@ static inline bool common_job_start(TerminalJobData *data, typval_T *rettv)
Process *proc = (Process *)&data->proc;
if (proc->type == kProcessTypePty && proc->detach) {
EMSG2(_(e_invarg2), "terminal/pty job cannot be detached");
+ xfree(data->proc.pty.term_name);
+ shell_free_argv(proc->argv);
+ free_term_job_data_event((void **)&data);
return false;
}
+ data->id = next_chan_id++;
+ pmap_put(uint64_t)(jobs, data->id, data);
+
data->refcount++;
char *cmd = xstrdup(proc->argv[0]);
if (!process_spawn(proc)) {
@@ -21782,7 +21788,6 @@ static inline bool common_job_start(TerminalJobData *data, typval_T *rettv)
}
xfree(cmd);
- data->id = next_chan_id++;
if (data->rpc) {
// the rpc channel takes over the in and out streams
@@ -21799,7 +21804,6 @@ static inline bool common_job_start(TerminalJobData *data, typval_T *rettv)
rstream_init(proc->err, 0);
rstream_start(proc->err, on_job_stderr, data);
}
- pmap_put(uint64_t)(jobs, data->id, data);
rettv->vval.v_number = data->id;
return true;
}
@@ -21821,6 +21825,7 @@ static inline void free_term_job_data_event(void **argv)
dict_unref(data->self);
}
queue_free(data->events);
+ pmap_del(uint64_t)(jobs, data->id);
xfree(data);
}
@@ -21927,7 +21932,6 @@ static void on_process_exit(Process *proc, int status, void *d)
process_job_event(data, data->on_exit, "exit", NULL, 0, status);
- pmap_del(uint64_t)(jobs, data->id);
term_job_data_decref(data);
}