[PATCH/RFC 06/11] run-command: add kill_async() and is_async_alive()
These functions will aid the Windows port of git-daemon.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---
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