[PATCH/RFC 06/11] run-command: add kill_async() and is_async_alive()
From: Erik Faye-Lund <hidden>
Date: 2016-06-15 22:47:46
Subsystem:
the rest · Maintainer:
Linus Torvalds
These functions will aid the Windows port of git-daemon. Signed-off-by: Erik Faye-Lund <redacted> --- run-command.c | 27 +++++++++++++++++++++++++++ run-command.h | 2 ++ 2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/run-command.c b/run-command.c
index cf2d8f7..e5a0e06 100644
--- a/run-command.c
+++ b/run-command.c@@ -373,6 +373,33 @@ int finish_async(struct async *async) return ret; } +int kill_async(struct async *async) +{ +#ifndef WIN32 + return kill(async->pid, SIGTERM); +#else + DWORD ret = 0; + if (!TerminateThread(async->tid, 0)) + ret = error("killing thread failed: %lu", GetLastError()); + else if (!GetExitCodeThread(async->tid, &ret)) + ret = error("cannot get thread exit code: %lu", GetLastError()); + return ret; +#endif +} + +int is_async_alive(struct async *async) +{ +#ifndef WIN32 + int dummy; + return waitpid(async->pid, &dummy, WNOHANG); +#else + int ret = WaitForSingleObject(async->tid, 0); + if (ret == WAIT_FAILED) + return error("checking thread state failed: %lu", GetLastError()); + return ret != WAIT_OBJECT_0; +#endif +} + int run_hook(const char *index_file, const char *name, ...) { struct child_process hook;
diff --git a/run-command.h b/run-command.h
index fb34209..955b0bd 100644
--- a/run-command.h
+++ b/run-command.h@@ -80,5 +80,7 @@ struct async { int start_async(struct async *async); int finish_async(struct async *async); +int kill_async(struct async *async); +int is_async_alive(struct async *async); #endif
--
1.6.5.rc2.7.g4f8d3