forked from aniani/vim
patch 8.0.0054
Problem: On Windows job_stop() stops cmd.exe, not the processes it runs. (Linwei) Solution: Iterate over all processes and terminate the one where the parent is the job process. Now only when there is no job object. (Yasuhiro Matsumoto, closes #1203)
This commit is contained in:
@@ -50,6 +50,10 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_JOB_CHANNEL
|
||||
# include <tlhelp32.h>
|
||||
#endif
|
||||
|
||||
#ifdef __MINGW32__
|
||||
# ifndef FROM_LEFT_1ST_BUTTON_PRESSED
|
||||
# define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
|
||||
@@ -5020,6 +5024,48 @@ mch_detect_ended_job(job_T *job_list)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
terminate_all(HANDLE process, int code)
|
||||
{
|
||||
PROCESSENTRY32 pe;
|
||||
HANDLE h = INVALID_HANDLE_VALUE;
|
||||
DWORD pid = GetProcessId(process);
|
||||
|
||||
if (pid != 0)
|
||||
{
|
||||
h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (h != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
pe.dwSize = sizeof(PROCESSENTRY32);
|
||||
if (!Process32First(h, &pe))
|
||||
goto theend;
|
||||
|
||||
do
|
||||
{
|
||||
if (pe.th32ParentProcessID == pid)
|
||||
{
|
||||
HANDLE ph = OpenProcess(
|
||||
PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
|
||||
if (ph != NULL)
|
||||
{
|
||||
terminate_all(ph, code);
|
||||
CloseHandle(ph);
|
||||
}
|
||||
}
|
||||
} while (Process32Next(h, &pe));
|
||||
|
||||
CloseHandle(h);
|
||||
}
|
||||
}
|
||||
|
||||
theend:
|
||||
return TerminateProcess(process, code);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a (deadly) signal to "job".
|
||||
* Return FAIL if it didn't work.
|
||||
*/
|
||||
int
|
||||
mch_stop_job(job_T *job, char_u *how)
|
||||
{
|
||||
@@ -5027,10 +5073,10 @@ mch_stop_job(job_T *job, char_u *how)
|
||||
|
||||
if (STRCMP(how, "term") == 0 || STRCMP(how, "kill") == 0 || *how == NUL)
|
||||
{
|
||||
/* deadly signal */
|
||||
if (job->jv_job_object != NULL)
|
||||
return TerminateJobObject(job->jv_job_object, 0) ? OK : FAIL;
|
||||
else
|
||||
return TerminateProcess(job->jv_proc_info.hProcess, 0) ? OK : FAIL;
|
||||
return terminate_all(job->jv_proc_info.hProcess, 0) ? OK : FAIL;
|
||||
}
|
||||
|
||||
if (!AttachConsole(job->jv_proc_info.dwProcessId))
|
||||
|
@@ -764,6 +764,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
54,
|
||||
/**/
|
||||
53,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user