Skip to content

Instantly share code, notes, and snippets.

@mattn
Last active January 23, 2018 21:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattn/6a048122540cc1c1a4ebd9a373a725d4 to your computer and use it in GitHub Desktop.
Save mattn/6a048122540cc1c1a4ebd9a373a725d4 to your computer and use it in GitHub Desktop.
diff --git a/src/os_win32.c b/src/os_win32.c
index d52beb8..9b26603 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -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
@@ -4796,7 +4800,6 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
- HANDLE jo;
SECURITY_ATTRIBUTES saAttr;
channel_T *channel = NULL;
HANDLE ifd[2];
@@ -4821,13 +4824,6 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
efd[0] = INVALID_HANDLE_VALUE;
efd[1] = INVALID_HANDLE_VALUE;
- jo = CreateJobObject(NULL, NULL);
- if (jo == NULL)
- {
- job->jv_status = JOB_FAILED;
- goto failed;
- }
-
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
@@ -4912,28 +4908,17 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
}
if (!vim_create_process(cmd, TRUE,
- CREATE_SUSPENDED |
CREATE_DEFAULT_ERROR_MODE |
CREATE_NEW_PROCESS_GROUP |
CREATE_NEW_CONSOLE,
&si, &pi))
{
- CloseHandle(jo);
job->jv_status = JOB_FAILED;
goto failed;
}
- if (!AssignProcessToJobObject(jo, pi.hProcess))
- {
- /* if failing, switch the way to terminate
- * process with TerminateProcess. */
- CloseHandle(jo);
- jo = NULL;
- }
- ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
job->jv_proc_info = pi;
- job->jv_job_object = jo;
job->jv_status = JOB_STARTED;
CloseHandle(ifd[0]);
@@ -5020,6 +5005,39 @@ 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);
+
+ h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (h == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ pe.dwSize = sizeof(PROCESSENTRY32);
+ if (!Process32First(h, &pe))
+ return FALSE;
+
+ 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);
+ return TerminateProcess(process, code);
+}
+
int
mch_stop_job(job_T *job, char_u *how)
{
@@ -5027,10 +5045,7 @@ mch_stop_job(job_T *job, char_u *how)
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;
- 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))
@@ -5051,8 +5066,6 @@ mch_clear_job(job_T *job)
{
if (job->jv_status != JOB_FAILED)
{
- if (job->jv_job_object != NULL)
- CloseHandle(job->jv_job_object);
CloseHandle(job->jv_proc_info.hProcess);
}
}
diff --git a/src/structs.h b/src/structs.h
index 7a4d7fb..bb0fc3a 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1437,7 +1437,6 @@ struct jobvar_S
#endif
#ifdef WIN32
PROCESS_INFORMATION jv_proc_info;
- HANDLE jv_job_object;
#endif
jobstatus_T jv_status;
char_u *jv_stoponexit; /* allocated */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment