From: Johannes Sixt Date: Tue, 9 Mar 2010 20:00:36 +0000 (+0100) Subject: Enable threaded async procedures whenever pthreads is available X-Git-Tag: v1.7.2-rc0~31^2~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=f6b6098316192475ff0b3fa2ba894d7e555bdfac;p=git.git Enable threaded async procedures whenever pthreads is available Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt index 44876fa70..f18b4f481 100644 --- a/Documentation/technical/api-run-command.txt +++ b/Documentation/technical/api-run-command.txt @@ -231,8 +231,9 @@ The function pointer in .proc has the following signature: There are serious restrictions on what the asynchronous function can do -because this facility is implemented by a pipe to a forked process on -UNIX, but by a thread in the same address space on Windows: +because this facility is implemented by a thread in the same address +space on most platforms (when pthreads is available), but by a pipe to +a forked process otherwise: . It cannot change the program's state (global variables, environment, etc.) in a way that the caller notices; in other words, .in and .out diff --git a/Makefile b/Makefile index 2fe52f816..52f2cc040 100644 --- a/Makefile +++ b/Makefile @@ -979,7 +979,6 @@ ifeq ($(uname_S),Windows) NO_CURL = YesPlease NO_PYTHON = YesPlease BLK_SHA1 = YesPlease - ASYNC_AS_THREAD = YesPlease CC = compat/vcbuild/scripts/clink.pl AR = compat/vcbuild/scripts/lib.pl @@ -1031,7 +1030,6 @@ ifneq (,$(findstring MINGW,$(uname_S))) NO_REGEX = YesPlease NO_PYTHON = YesPlease BLK_SHA1 = YesPlease - ASYNC_AS_THREAD = YesPlease COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch -Icompat/win32 COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o \ @@ -1344,9 +1342,6 @@ ifdef NO_PTHREADS else EXTLIBS += $(PTHREAD_LIBS) LIB_OBJS += thread-utils.o -ifdef ASYNC_AS_THREAD - BASIC_CFLAGS += -DASYNC_AS_THREAD -endif endif ifdef DIR_HAS_BSD_GROUP_SEMANTICS diff --git a/run-command.c b/run-command.c index 66cc4bfa5..61b153987 100644 --- a/run-command.c +++ b/run-command.c @@ -447,7 +447,7 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const return run_command(&cmd); } -#ifdef ASYNC_AS_THREAD +#ifndef NO_PTHREADS static pthread_t main_thread; static int main_thread_set; static pthread_key_t async_key; @@ -455,10 +455,10 @@ static pthread_key_t async_key; static void *run_thread(void *data) { struct async *async = data; + intptr_t ret; pthread_setspecific(async_key, async); - - intptr_t ret = async->proc(async->proc_in, async->proc_out, async->data); + ret = async->proc(async->proc_in, async->proc_out, async->data); return (void *)ret; } @@ -521,7 +521,7 @@ int start_async(struct async *async) else proc_out = -1; -#ifndef ASYNC_AS_THREAD +#ifdef NO_PTHREADS /* Flush stdio before fork() to avoid cloning buffers */ fflush(NULL); @@ -590,7 +590,7 @@ error: int finish_async(struct async *async) { -#ifndef ASYNC_AS_THREAD +#ifdef NO_PTHREADS return wait_or_whine(async->pid, "child process", 0); #else void *ret = (void *)(intptr_t)(-1); diff --git a/run-command.h b/run-command.h index 40db39cec..56491b9f2 100644 --- a/run-command.h +++ b/run-command.h @@ -1,7 +1,7 @@ #ifndef RUN_COMMAND_H #define RUN_COMMAND_H -#ifdef ASYNC_AS_THREAD +#ifndef NO_PTHREADS #include #endif @@ -78,7 +78,7 @@ struct async { void *data; int in; /* caller writes here and closes it */ int out; /* caller reads from here and closes it */ -#ifndef ASYNC_AS_THREAD +#ifdef NO_PTHREADS pid_t pid; #else pthread_t tid;