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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
|
# include <tlhelp32.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
#ifdef __MINGW32__
|
||||||
# ifndef FROM_LEFT_1ST_BUTTON_PRESSED
|
# ifndef FROM_LEFT_1ST_BUTTON_PRESSED
|
||||||
# define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
|
# define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
|
||||||
@@ -5020,6 +5024,48 @@ mch_detect_ended_job(job_T *job_list)
|
|||||||
return NULL;
|
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
|
int
|
||||||
mch_stop_job(job_T *job, char_u *how)
|
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)
|
if (STRCMP(how, "term") == 0 || STRCMP(how, "kill") == 0 || *how == NUL)
|
||||||
{
|
{
|
||||||
|
/* deadly signal */
|
||||||
if (job->jv_job_object != NULL)
|
if (job->jv_job_object != NULL)
|
||||||
return TerminateJobObject(job->jv_job_object, 0) ? OK : FAIL;
|
return TerminateJobObject(job->jv_job_object, 0) ? OK : FAIL;
|
||||||
else
|
return terminate_all(job->jv_proc_info.hProcess, 0) ? OK : FAIL;
|
||||||
return TerminateProcess(job->jv_proc_info.hProcess, 0) ? OK : FAIL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AttachConsole(job->jv_proc_info.dwProcessId))
|
if (!AttachConsole(job->jv_proc_info.dwProcessId))
|
||||||
|
@@ -764,6 +764,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
54,
|
||||||
/**/
|
/**/
|
||||||
53,
|
53,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user