Portable alloca for Git
In the next patch we'll have to use alloca() for performance reasons, but since alloca is non-standardized and is not portable, let's have a trick with compatibility wrappers: 1. at configure time, determine, do we have working alloca() through alloca.h, and define #define HAVE_ALLOCA_H if yes. 2. in code #ifdef HAVE_ALLOCA_H # include <alloca.h> # define xalloca(size) (alloca(size)) # define xalloca_free(p) do {} while(0) #else # define xalloca(size) (xmalloc(size)) # define xalloca_free(p) (free(p)) #endif and use it like func() { p = xalloca(size); ... xalloca_free(p); } This way, for systems, where alloca is available, we'll have optimal on-stack allocations with fast executions. On the other hand, on systems, where alloca is not available, this gracefully fallbacks to xmalloc/free. Both autoconf and config.mak.uname configurations were updated. For autoconf, we are not bothering considering cases, when no alloca.h is available, but alloca() works some other way - its simply alloca.h is available and works or not, everything else is deep legacy. For config.mak.uname, I've tried to make my almost-sure guess for where alloca() is available, but since I only have access to Linux it is the only change I can be sure about myself, with relevant to other changed systems people Cc'ed. NOTE SunOS and Windows had explicit -DHAVE_ALLOCA_H in their configurations. I've changed that to now-common HAVE_ALLOCA_H=YesPlease which should be correct. Cc: Brandon Casey <drafnel@gmail.com> Cc: Marius Storm-Olsen <mstormo@gmail.com> Cc: Johannes Sixt <j6t@kdbg.org> Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de> Cc: Ramsay Jones <ramsay@ramsay1.demon.co.uk> Cc: Gerrit Pape <pape@smarden.org> Cc: Petr Salinger <Petr.Salinger@seznam.cz> Cc: Jonathan Nieder <jrnieder@gmail.com> Acked-by: Thomas Schwinge <thomas@codesourcery.com> (GNU Hurd changes) Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
12cd81743d
commit
61f76a3612
6
Makefile
6
Makefile
@ -30,6 +30,8 @@ all::
|
|||||||
# Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
|
# Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
|
||||||
# /foo/bar/include and /foo/bar/lib directories.
|
# /foo/bar/include and /foo/bar/lib directories.
|
||||||
#
|
#
|
||||||
|
# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
|
||||||
|
#
|
||||||
# Define NO_CURL if you do not have libcurl installed. git-http-fetch and
|
# Define NO_CURL if you do not have libcurl installed. git-http-fetch and
|
||||||
# git-http-push are not built, and you cannot use http:// and https://
|
# git-http-push are not built, and you cannot use http:// and https://
|
||||||
# transports (neither smart nor dumb).
|
# transports (neither smart nor dumb).
|
||||||
@ -1099,6 +1101,10 @@ ifdef USE_LIBPCRE
|
|||||||
EXTLIBS += -lpcre
|
EXTLIBS += -lpcre
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef HAVE_ALLOCA_H
|
||||||
|
BASIC_CFLAGS += -DHAVE_ALLOCA_H
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef NO_CURL
|
ifdef NO_CURL
|
||||||
BASIC_CFLAGS += -DNO_CURL
|
BASIC_CFLAGS += -DNO_CURL
|
||||||
REMOTE_CURL_PRIMARY =
|
REMOTE_CURL_PRIMARY =
|
||||||
|
@ -28,6 +28,7 @@ ifeq ($(uname_S),OSF1)
|
|||||||
NO_NSEC = YesPlease
|
NO_NSEC = YesPlease
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),Linux)
|
ifeq ($(uname_S),Linux)
|
||||||
|
HAVE_ALLOCA_H = YesPlease
|
||||||
NO_STRLCPY = YesPlease
|
NO_STRLCPY = YesPlease
|
||||||
NO_MKSTEMPS = YesPlease
|
NO_MKSTEMPS = YesPlease
|
||||||
HAVE_PATHS_H = YesPlease
|
HAVE_PATHS_H = YesPlease
|
||||||
@ -35,6 +36,7 @@ ifeq ($(uname_S),Linux)
|
|||||||
HAVE_DEV_TTY = YesPlease
|
HAVE_DEV_TTY = YesPlease
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),GNU/kFreeBSD)
|
ifeq ($(uname_S),GNU/kFreeBSD)
|
||||||
|
HAVE_ALLOCA_H = YesPlease
|
||||||
NO_STRLCPY = YesPlease
|
NO_STRLCPY = YesPlease
|
||||||
NO_MKSTEMPS = YesPlease
|
NO_MKSTEMPS = YesPlease
|
||||||
HAVE_PATHS_H = YesPlease
|
HAVE_PATHS_H = YesPlease
|
||||||
@ -103,6 +105,7 @@ ifeq ($(uname_S),SunOS)
|
|||||||
NEEDS_NSL = YesPlease
|
NEEDS_NSL = YesPlease
|
||||||
SHELL_PATH = /bin/bash
|
SHELL_PATH = /bin/bash
|
||||||
SANE_TOOL_PATH = /usr/xpg6/bin:/usr/xpg4/bin
|
SANE_TOOL_PATH = /usr/xpg6/bin:/usr/xpg4/bin
|
||||||
|
HAVE_ALLOCA_H = YesPlease
|
||||||
NO_STRCASESTR = YesPlease
|
NO_STRCASESTR = YesPlease
|
||||||
NO_MEMMEM = YesPlease
|
NO_MEMMEM = YesPlease
|
||||||
NO_MKDTEMP = YesPlease
|
NO_MKDTEMP = YesPlease
|
||||||
@ -146,7 +149,7 @@ ifeq ($(uname_S),SunOS)
|
|||||||
endif
|
endif
|
||||||
INSTALL = /usr/ucb/install
|
INSTALL = /usr/ucb/install
|
||||||
TAR = gtar
|
TAR = gtar
|
||||||
BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__ -DHAVE_ALLOCA_H
|
BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_O),Cygwin)
|
ifeq ($(uname_O),Cygwin)
|
||||||
ifeq ($(shell expr "$(uname_R)" : '1\.[1-6]\.'),4)
|
ifeq ($(shell expr "$(uname_R)" : '1\.[1-6]\.'),4)
|
||||||
@ -166,6 +169,7 @@ ifeq ($(uname_O),Cygwin)
|
|||||||
else
|
else
|
||||||
NO_REGEX = UnfortunatelyYes
|
NO_REGEX = UnfortunatelyYes
|
||||||
endif
|
endif
|
||||||
|
HAVE_ALLOCA_H = YesPlease
|
||||||
NEEDS_LIBICONV = YesPlease
|
NEEDS_LIBICONV = YesPlease
|
||||||
NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
|
NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
|
||||||
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
||||||
@ -239,6 +243,7 @@ ifeq ($(uname_S),AIX)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),GNU)
|
ifeq ($(uname_S),GNU)
|
||||||
# GNU/Hurd
|
# GNU/Hurd
|
||||||
|
HAVE_ALLOCA_H = YesPlease
|
||||||
NO_STRLCPY = YesPlease
|
NO_STRLCPY = YesPlease
|
||||||
NO_MKSTEMPS = YesPlease
|
NO_MKSTEMPS = YesPlease
|
||||||
HAVE_PATHS_H = YesPlease
|
HAVE_PATHS_H = YesPlease
|
||||||
@ -316,6 +321,7 @@ endif
|
|||||||
ifeq ($(uname_S),Windows)
|
ifeq ($(uname_S),Windows)
|
||||||
GIT_VERSION := $(GIT_VERSION).MSVC
|
GIT_VERSION := $(GIT_VERSION).MSVC
|
||||||
pathsep = ;
|
pathsep = ;
|
||||||
|
HAVE_ALLOCA_H = YesPlease
|
||||||
NO_PREAD = YesPlease
|
NO_PREAD = YesPlease
|
||||||
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
||||||
NO_LIBGEN_H = YesPlease
|
NO_LIBGEN_H = YesPlease
|
||||||
@ -363,7 +369,7 @@ ifeq ($(uname_S),Windows)
|
|||||||
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
|
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
|
||||||
compat/win32/pthread.o compat/win32/syslog.o \
|
compat/win32/pthread.o compat/win32/syslog.o \
|
||||||
compat/win32/dirent.o
|
compat/win32/dirent.o
|
||||||
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
|
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
|
||||||
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
|
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
|
||||||
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
|
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
|
||||||
PTHREAD_LIBS =
|
PTHREAD_LIBS =
|
||||||
|
@ -272,6 +272,14 @@ AS_HELP_STRING([], [ARG can be also prefix for libpcre library and hea
|
|||||||
GIT_CONF_SUBST([LIBPCREDIR])
|
GIT_CONF_SUBST([LIBPCREDIR])
|
||||||
fi)
|
fi)
|
||||||
#
|
#
|
||||||
|
# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
|
||||||
|
AC_FUNC_ALLOCA
|
||||||
|
case $ac_cv_working_alloca_h in
|
||||||
|
yes) HAVE_ALLOCA_H=YesPlease;;
|
||||||
|
*) HAVE_ALLOCA_H='';;
|
||||||
|
esac
|
||||||
|
GIT_CONF_SUBST([HAVE_ALLOCA_H])
|
||||||
|
#
|
||||||
# Define NO_CURL if you do not have curl installed. git-http-pull and
|
# Define NO_CURL if you do not have curl installed. git-http-pull and
|
||||||
# git-http-push are not built, and you cannot use http:// and https://
|
# git-http-push are not built, and you cannot use http:// and https://
|
||||||
# transports.
|
# transports.
|
||||||
|
@ -526,6 +526,14 @@ extern void release_pack_memory(size_t);
|
|||||||
typedef void (*try_to_free_t)(size_t);
|
typedef void (*try_to_free_t)(size_t);
|
||||||
extern try_to_free_t set_try_to_free_routine(try_to_free_t);
|
extern try_to_free_t set_try_to_free_routine(try_to_free_t);
|
||||||
|
|
||||||
|
#ifdef HAVE_ALLOCA_H
|
||||||
|
# include <alloca.h>
|
||||||
|
# define xalloca(size) (alloca(size))
|
||||||
|
# define xalloca_free(p) do {} while (0)
|
||||||
|
#else
|
||||||
|
# define xalloca(size) (xmalloc(size))
|
||||||
|
# define xalloca_free(p) (free(p))
|
||||||
|
#endif
|
||||||
extern char *xstrdup(const char *str);
|
extern char *xstrdup(const char *str);
|
||||||
extern void *xmalloc(size_t size);
|
extern void *xmalloc(size_t size);
|
||||||
extern void *xmallocz(size_t size);
|
extern void *xmallocz(size_t size);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user