Alien-uv
view release on metacpan or search on metacpan
libuv/src/win/process.c view on Meta::CPAN
uv_fatal_error(GetLastError(), "RegisterWaitForSingleObject");
}
CloseHandle(info.hThread);
assert(!err);
/* Make the handle active. It will remain active until the exit callback is
* made or the handle is closed, whichever happens first. */
uv__handle_start(process);
/* Cleanup, whether we succeeded or failed. */
done:
uv__free(application);
uv__free(application_path);
uv__free(arguments);
uv__free(cwd);
uv__free(env);
uv__free(alloc_path);
if (process->child_stdio_buffer != NULL) {
/* Clean up child stdio handles. */
uv__stdio_destroy(process->child_stdio_buffer);
process->child_stdio_buffer = NULL;
}
return uv_translate_sys_error(err);
}
static int uv__kill(HANDLE process_handle, int signum) {
if (signum < 0 || signum >= NSIG) {
return UV_EINVAL;
}
switch (signum) {
case SIGTERM:
case SIGKILL:
case SIGINT: {
/* Unconditionally terminate the process. On Windows, killed processes
* normally return 1. */
DWORD status;
int err;
if (TerminateProcess(process_handle, 1))
return 0;
/* If the process already exited before TerminateProcess was called,.
* TerminateProcess will fail with ERROR_ACCESS_DENIED. */
err = GetLastError();
if (err == ERROR_ACCESS_DENIED &&
GetExitCodeProcess(process_handle, &status) &&
status != STILL_ACTIVE) {
return UV_ESRCH;
}
return uv_translate_sys_error(err);
}
case 0: {
/* Health check: is the process still alive? */
DWORD status;
if (!GetExitCodeProcess(process_handle, &status))
return uv_translate_sys_error(GetLastError());
if (status != STILL_ACTIVE)
return UV_ESRCH;
return 0;
}
default:
/* Unsupported signal. */
return UV_ENOSYS;
}
}
int uv_process_kill(uv_process_t* process, int signum) {
int err;
if (process->process_handle == INVALID_HANDLE_VALUE) {
return UV_EINVAL;
}
err = uv__kill(process->process_handle, signum);
if (err) {
return err; /* err is already translated. */
}
process->exit_signal = signum;
return 0;
}
int uv_kill(int pid, int signum) {
int err;
HANDLE process_handle;
if (pid == 0) {
process_handle = GetCurrentProcess();
} else {
process_handle = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION,
FALSE,
pid);
}
if (process_handle == NULL) {
err = GetLastError();
if (err == ERROR_INVALID_PARAMETER) {
return UV_ESRCH;
} else {
return uv_translate_sys_error(err);
}
}
err = uv__kill(process_handle, signum);
CloseHandle(process_handle);
( run in 1.120 second using v1.01-cache-2.11-cpan-df04353d9ac )