зеркало из https://github.com/microsoft/git.git
Enable threaded async procedures whenever pthreads is available
Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
0ea1c89ba6
Коммит
f6b6098316
|
@ -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
|
||||
|
|
5
Makefile
5
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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef RUN_COMMAND_H
|
||||
#define RUN_COMMAND_H
|
||||
|
||||
#ifdef ASYNC_AS_THREAD
|
||||
#ifndef NO_PTHREADS
|
||||
#include <pthread.h>
|
||||
#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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче