diff options
author | Bert Belder <bertbelder@gmail.com> | 2013-05-14 16:16:15 -0700 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2013-05-14 16:16:15 -0700 |
commit | 7437633538093ec0fa526e48d890f0fb55881d22 (patch) | |
tree | c3bb83a573b9d96bca21104f86cb650e4b179104 | |
parent | 8886c6bf624e6627f68a10c5f4c6399bb5257cdf (diff) | |
download | node-tj-try-this.tar.gz |
Testtj-try-this
-rw-r--r-- | deps/uv/src/win/process.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/deps/uv/src/win/process.c b/deps/uv/src/win/process.c index c5649d3ae..384e98cf1 100644 --- a/deps/uv/src/win/process.c +++ b/deps/uv/src/win/process.c @@ -753,6 +753,37 @@ void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle) { } + +static HANDLE global_job_handle; +static uv_once_t global_job_init_guard = UV_ONCE_INIT; + + + +static void uv__global_job_init() { + SECURITY_ATTRIBUTES attr; + JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; + + memset(&attr, 0, sizeof attr); + attr.bInheritHandle = FALSE; + + memset(&info, 0, sizeof info); + info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_BREAKAWAY_OK | + JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK | + JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; + + global_job_handle = CreateJobObjectW(&attr, NULL); + if (global_job_handle == NULL) + uv_fatal_error(GetLastError(), "CreateJobObjectW"); + + if (!SetInformationJobObject(global_job_handle, + JobObjectExtendedLimitInformation, + &info, + sizeof info)) + uv_fatal_error(GetLastError(), "SetInformationJobObject"); +} + + int uv_spawn(uv_loop_t* loop, uv_process_t* process, uv_process_options_t options) { int i; @@ -908,6 +939,14 @@ int uv_spawn(uv_loop_t* loop, uv_process_t* process, process->process_handle = info.hProcess; process->pid = info.dwProcessId; + /* If the process isn't spawned as detached, assign to the global job */ + /* object so windows will kill it when the parent process dies. */ + if (!(options.flags & UV_PROCESS_DETACHED)) { + uv_once(&global_job_init_guard, uv__global_job_init); + if (!AssignProcessToJobObject(global_job_handle, info.hProcess)) + uv_fatal_error(GetLastError(), "AssignProcessToJobObject"); + } + /* Set IPC pid to all IPC pipes. */ for (i = 0; i < options.stdio_count; i++) { const uv_stdio_container_t* fdopt = &options.stdio[i]; |