run-command: provide in_async query function

It's not easy for arbitrary code to find out whether it is running in an async process or not. A top-level function which is fed to start_async() can know (you just pass down an argument saying "you are async"). But that function may call other global functions, and we would not want to have to pass the information all the way through the call stack. Nor can we simply set a global variable, as those may be shared between async threads and the main thread (if the platform supports pthreads). We need pthread tricks _or_ a global variable, depending on how start_async is implemented. The callers don't have enough information to do this right, so let's provide a simple query function that does. Fortunately we can reuse the existing infrastructure to make the pthread case simple (and even simplify die_async() by using our new function). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Sep 1, 2015 at 16:22 UTC 661a8cf408e83e4901bf09e2a48e9306622442dd
2 files changed +16 -1
run-command.c
+15 -1
@@ -608,7 +608,7 @@ static NORETURN void die_async(const char *err, va_list params)
608 {
609 vreportf("fatal: ", err, params);
610
611 - if (!pthread_equal(main_thread, pthread_self())) {
611 + if (in_async()) {
612 struct async *async = pthread_getspecific(async_key);
613 if (async->proc_in >= 0)
614 close(async->proc_in);
@@ -627,6 +627,13 @@ static int async_die_is_recursing(void)
627 return ret != NULL;
628 }
629
630 +int in_async(void)
631 +{
632 + if (!main_thread_set)
633 + return 0; /* no asyncs started yet */
634 + return !pthread_equal(main_thread, pthread_self());
635 +}
636 +
637 #else
638
639 static struct {
@@ -666,6 +673,12 @@ int git_atexit(void (*handler)(void))
673 }
674 #define atexit git_atexit
675
676 +static int process_is_async;
677 +int in_async(void)
678 +{
679 + return process_is_async;
680 +}
681 +
682 #endif
683
684 int start_async(struct async *async)
@@ -725,6 +738,7 @@ int start_async(struct async *async)
738 if (need_out)
739 close(fdout[0]);
740 git_atexit_clear();
741 + process_is_async = 1;
742 exit(!!async->proc(proc_in, proc_out, async->data));
743 }
744
run-command.h
+1
@@ -113,5 +113,6 @@ struct async {
113
114 int start_async(struct async *async);
115 int finish_async(struct async *async);
116 +int in_async(void);
117
118 #endif