Mercurial > vim
changeset 8251:989ac3aed1ef v7.4.1418
commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Feb 25 20:56:01 2016 +0100
patch 7.4.1418
Problem: job_stop() on MS-Windows does not really stop the job.
Solution: Make the default to stop the job forcefully. (Ken Takata)
Make MS-Windows and Unix more similar.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 25 Feb 2016 21:00:04 +0100 |
parents | 271c3532857a |
children | 5967a5b23715 |
files | runtime/doc/eval.txt src/os_unix.c src/os_win32.c src/version.c |
diffstat | 4 files changed, 34 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -4474,21 +4474,27 @@ job_status({job}) *job_status()* *E9 job_stop({job} [, {how}]) *job_stop()* Stop the {job}. This can also be used to signal the job. - When {how} is omitted or is "term" the job will be terminated - normally. For Unix SIGTERM is sent. For MS-Windows - CTRL_BREAK will be sent. This goes to the process group, thus - children may also be affected. - - Other values for Unix: - "hup" Unix: SIGHUP - "quit" Unix: SIGQUIT - "kill" Unix: SIGKILL (strongest way to stop) - number Unix: signal with that number - - Other values for MS-Windows: - "int" Windows: CTRL_C - "kill" Windows: terminate process forcedly - Others Windows: CTRL_BREAK + When {how} is omitted or is "term" the job will be terminated. + For Unix SIGTERM is sent. On MS-Windows the job will be + terminated forcedly (there is no "gentle" way). + This goes to the process group, thus children may also be + affected. + + Effect for Unix: + "term" SIGTERM (default) + "hup" SIGHUP + "quit" SIGQUIT + "int" SIGINT + "kill" SIGKILL (strongest way to stop) + number signal with that number + + Effect for MS-Windows: + "term" terminate process forcedly (default) + "hup" CTRL_BREAK + "quit" CTRL_BREAK + "int" CTRL_C + "kill" terminate process forcedly + Others CTRL_BREAK On Unix the signal is sent to the process group. This means that when the job is "sh -c command" it affects both the shell
--- a/src/os_unix.c +++ b/src/os_unix.c @@ -5202,12 +5202,14 @@ mch_stop_job(job_T *job, char_u *how) int sig = -1; pid_t job_pid; - if (STRCMP(how, "hup") == 0) + if (*how == NUL || STRCMP(how, "term") == 0) + sig = SIGTERM; + else if (STRCMP(how, "hup") == 0) sig = SIGHUP; - else if (*how == NUL || STRCMP(how, "term") == 0) - sig = SIGTERM; else if (STRCMP(how, "quit") == 0) sig = SIGQUIT; + else if (STRCMP(how, "int") == 0) + sig = SIGINT; else if (STRCMP(how, "kill") == 0) sig = SIGKILL; else if (isdigit(*how))
--- a/src/os_win32.c +++ b/src/os_win32.c @@ -5141,10 +5141,9 @@ mch_job_status(job_T *job) int mch_stop_job(job_T *job, char_u *how) { - int ret = 0; - int ctrl_c = STRCMP(how, "int") == 0; - - if (STRCMP(how, "kill") == 0) + int ret; + + if (STRCMP(how, "term") == 0 || STRCMP(how, "kill") == 0 || *how == NUL) { if (job->jv_job_object != NULL) return TerminateJobObject(job->jv_job_object, 0) ? OK : FAIL; @@ -5155,9 +5154,9 @@ mch_stop_job(job_T *job, char_u *how) if (!AttachConsole(job->jv_proc_info.dwProcessId)) return FAIL; ret = GenerateConsoleCtrlEvent( - ctrl_c ? CTRL_C_EVENT : CTRL_BREAK_EVENT, - job->jv_proc_info.dwProcessId) - ? OK : FAIL; + STRCMP(how, "int") == 0 ? CTRL_C_EVENT : CTRL_BREAK_EVENT, + job->jv_proc_info.dwProcessId) + ? OK : FAIL; FreeConsole(); return ret; }