# HG changeset patch # User Christian Brabandt # Date 1456430404 -3600 # Node ID 989ac3aed1ef2460f694defb0f7012ffbf854ca8 # Parent 271c3532857a08a15d7a822965fba28826de27ff commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1 Author: Bram Moolenaar 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. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- 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 diff --git a/src/os_unix.c b/src/os_unix.c --- 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)) diff --git a/src/os_win32.c b/src/os_win32.c --- 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; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1418, +/**/ 1417, /**/ 1416,