Change handling of C stack size

Previously: unconditionally use the size from ECL_OPT_C_STACK_SIZE if
it is larger than the OS provided value and if possible resize the
stack at runtime.

Now: Use ECL_OPT_C_STACK_SIZE if provided. Otherwise, use a) the OS
provided value if we can resize the stack at runtime (for Unix) or b)
the new build option ECL_DEFAULT_C_STACK_SIZE (1 MB) if we can set the
stack size at link time (for Windows).
This commit is contained in:
Marius Gerbershagen 2019-12-26 15:42:00 +01:00
parent a4e93f7b61
commit d7b2dfb722
8 changed files with 36 additions and 29 deletions

View file

@ -17,6 +17,9 @@ SOFTWARE_TYPE = NT
SOFTWARE_VERSION = 5.0
THEHOST = win32
# Size of the C stack in bytes
ECL_DEFAULT_C_STACK_SIZE = 1048576
# Define to 1 to make a 64-bit build
# ECL_WIN64 =
@ -132,7 +135,7 @@ CLIBS = $(CLIBS) DbgHelp.lib
!endif
CFLAGS = /EHsc /DGC_DLL /DGC_BUILD /nologo /D_CRT_SECURE_NO_DEPRECATE $(CFLAGS_CONFIG)
LDFLAGS = /link /incremental:no /nologo $(LDFLAGS_CONFIG)
LDFLAGS = /link /incremental:no /nologo $(LDFLAGS_CONFIG) /STACK:$(ECL_DEFAULT_C_STACK_SIZE)
# Additional configuration for thread support
@ -346,6 +349,7 @@ ecl-cc.bat: util\ecl-cc.bat Makefile
eclmin.lib: eclgmp.lib eclgc.lib lsp/config.lsp
cd c
$(MAKE) /nologo ECL_VERSION_NUMBER=$(ECL_VERSION_NUMBER) \
ECL_DEFAULT_C_STACK_SIZE=$(ECL_DEFAULT_C_STACK_SIZE) \
ECL_THREADS=$(ECL_THREADS) ECL_UNICODE=$(ECL_UNICODE) \
ECL_SSE=$(ECL_SSE) ECL_WIN64=$(ECL_WIN64) \
ECL_USE_DBGHELP=$(ECL_USE_DBGHELP) \

View file

@ -168,6 +168,7 @@ $(HFILES): ../ecl/config.h.msvc6 ../ecl/config-internal.h.msvc6 Makefile
-mkdir ..\ecl\impl
cut.exe "@ECL_FPE_CODE@" "$(srcdir:\=/)/arch/$(ECL_FPE_CODE)" \
"@ECL_VERSION_NUMBER@" "$(ECL_VERSION_NUMBER)" \
"@ECL_DEFAULT_C_STACK_SIZE@" "$(ECL_DEFAULT_C_STACK_SIZE)" \
"@ECL_THREADS@" "$(ECL_THREADS_FLAG)" \
"@ECL_UNICODE@" "$(ECL_UNICODE_FLAG)" \
"@ECL_SSE2@" "$(ECL_SSE_FLAG)" \
@ -175,6 +176,7 @@ $(HFILES): ../ecl/config.h.msvc6 ../ecl/config-internal.h.msvc6 Makefile
< ..\ecl\config.h.msvc6 > ..\ecl\config.h
cut.exe "@ECL_FPE_CODE@" "$(srcdir:\=/)/arch/$(ECL_FPE_CODE)" \
"@ECL_VERSION_NUMBER@" "$(ECL_VERSION_NUMBER)" \
"@ECL_DEFAULT_C_STACK_SIZE@" "$(ECL_DEFAULT_C_STACK_SIZE)" \
"@ECL_THREADS@" "$(ECL_THREADS_FLAG)" \
"@ECL_UNICODE@" "$(ECL_UNICODE_FLAG)" \
"@ECL_SSE2@" "$(ECL_SSE_FLAG)" \

View file

@ -126,11 +126,8 @@
/*
* Memory limits for the old garbage collector.
*/
#define LISP_PAGESIZE 2048 /* Page size in bytes */
#define MAXPAGE 16384 /* Maximum Memory Size */
/* We reserve these many bytes for computation with bignums registers */
#define BIGNUM_REGISTER_SIZE 16
#define LISP_PAGESIZE 2048 /* Page size in bytes */
#define MAXPAGE 65536 /* Maximum Memory Size */
/* We allocate a number of strings in a pool which is used to speed up reading */
#define ECL_MAX_STRING_POOL_SIZE 10
@ -191,7 +188,17 @@
# define ECL_MATHERR_TEST
#endif
#if defined(HAVE_LIBFFI) && defined(ECL_INCLUDE_FFI_H)
#include "@ECL_LIBFFI_HEADER@"
#endif
#define ECL_WINDOWS_BACKTRACE @ECL_USE_DBGHELP@
#if !ECL_WINDOWS_BACKTRACE
#undef ECL_WINDOWS_BACKTRACE
#endif
#if defined(HAVE_SYS_RESOURCE_H) && defined(RLIMIT_STACK) && !defined(NACL)
#define ECL_DEFAULT_C_STACK_SIZE 0 /* Use the stack size provided by the OS */
#else
#define ECL_DEFAULT_C_STACK_SIZE @ECL_DEFAULT_C_STACK_SIZE@
#endif

6
src/aclocal.m4 vendored
View file

@ -251,6 +251,8 @@ AC_SUBST(EXEEXT)
AC_SUBST(INSTALL_TARGET)dnl Which type of installation: flat directory or unix like.
AC_SUBST(thehost)
AC_SUBST(ECL_GC_DIR)dnl Which version of the Boehm-Weiser library to use
AC_SUBST(ECL_DEFAULT_C_STACK_SIZE)dnl Default size of the C stack in bytes
ECL_DEFAULT_C_STACK_SIZE=1048576 dnl Default to 1 MB if we can't set the stack size at runtime
ECL_GC_DIR=bdwgc
ECL_LDRPATH=''
SHAREDEXT='so'
@ -404,8 +406,8 @@ case "${host_os}" in
enable_threads='yes'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_GC_FLAGS='--enable-threads=win32'
SHARED_LDFLAGS=''
BUNDLE_LDFLAGS=''
SHARED_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
BUNDLE_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
SHAREDPREFIX=''
SHAREDEXT='dll'
PICFLAG=''

View file

@ -92,7 +92,7 @@ cl_fixnum ecl_option_values[ECL_OPT_LIMIT+1] = {
128, /* ECL_OPT_FRAME_STACK_SAFETY_AREA */
32768, /* ECL_OPT_LISP_STACK_SIZE */
128, /* ECL_OPT_LISP_STACK_SAFETY_AREA */
128*sizeof(cl_index)*1024, /* ECL_OPT_C_STACK_SIZE */
ECL_DEFAULT_C_STACK_SIZE, /* ECL_OPT_C_STACK_SIZE */
4*sizeof(cl_index)*1024, /* ECL_OPT_C_STACK_SAFETY_AREA */
HEAP_SIZE_DEFAULT, /* ECL_OPT_HEAP_SIZE */
1024*1024, /* ECL_OPT_HEAP_SAFETY_AREA */

23
src/configure vendored
View file

@ -658,6 +658,7 @@ MANUAL_INSTALL_TARGET
MANUAL_MAKE_TARGET
MAKEINFO
INSTALL_INFO
ECL_DEFAULT_C_STACK_SIZE
ECL_GC_DIR
thehost
INSTALL_TARGET
@ -740,7 +741,6 @@ infodir
docdir
oldincludedir
includedir
runstatedir
localstatedir
sharedstatedir
sysconfdir
@ -866,7 +866,6 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@ -1119,15 +1118,6 @@ do
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
-runstatedir | --runstatedir | --runstatedi | --runstated \
| --runstate | --runstat | --runsta | --runst | --runs \
| --run | --ru | --r)
ac_prev=runstatedir ;;
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
| --run=* | --ru=* | --r=*)
runstatedir=$ac_optarg ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@ -1265,7 +1255,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir runstatedir
libdir localedir mandir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
@ -1418,7 +1408,6 @@ Fine tuning of the installation directories:
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
@ -4952,7 +4941,7 @@ MV="mv"
ECL_GC_DIR=bdwgc
ECL_DEFAULT_C_STACK_SIZE=1048576 ECL_GC_DIR=bdwgc
ECL_LDRPATH=''
SHAREDEXT='so'
SHAREDPREFIX='lib'
@ -5106,8 +5095,8 @@ LSP_FEATURES="(cons :android ${LSP_FEATURES})"
enable_threads='yes'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_GC_FLAGS='--enable-threads=win32'
SHARED_LDFLAGS=''
BUNDLE_LDFLAGS=''
SHARED_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
BUNDLE_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
SHAREDPREFIX=''
SHAREDEXT='dll'
PICFLAG=''
@ -9007,8 +8996,6 @@ main ()
if (*(data + i) != *(data3 + i))
return 14;
close (fd);
free (data);
free (data3);
return 0;
}
_ACEOF

View file

@ -159,8 +159,7 @@ The second set is related to the sizes of different stacks. Currently ECL uses f
@item @code{FRAME_STACK_SAFETY_AREA} @tab cl_index @tab 128 @tab
@item @code{LISP_STACK_SIZE} @tab cl_index @tab 32768 @tab Size of interpreter stack.
@item @code{LISP_STACK_SAFETY_AREA} @tab cl_index @tab 128 @tab
@item @code{C_STACK_SIZE} @tab cl_index @tab 131072 @tab Size of C
stack@footnote{On operating systems on which ECL can resize the stack at runtime (currently only Unixes), the size of the C stack will be set to this value if the default stack size is smaller. Otherwise, this option should be set to the value of the available stack space to allow for reliable stack overflow detection.}.
@item @code{C_STACK_SIZE} @tab cl_index @tab 0 or 1048576 @tab Size of C stack in bytes. The effect and default value of this option depends on the operating system. On Unix, the default is 0 which means that ECL will use the stack size provided by the OS. If set to a non-default value, ECL will set the stack size to the given value unless the stack size provided by the OS is already large enough. On Windows, the stack size is set at build time and cannot be changed at runtime. Here, we use a default of 1 MiB. For other operating systems, it is up to the user to set this value to the available stack size so that ECL can reliably detect stack overflows.
@item @code{C_STACK_SAFETY_AREA} @tab cl_index @tab 4192 @tab
@item @code{THREAD_INTERRUPT_SIGNAL} @tab unsigned int @tab 0 @tab If nonzero, specify the unix signal which is used to communicate different Lisp threads.
@end multitable

View file

@ -244,3 +244,9 @@
#if defined(HAVE_LIBFFI) && defined(ECL_INCLUDE_FFI_H)
#include "@ECL_LIBFFI_HEADER@"
#endif
#if defined(HAVE_SYS_RESOURCE_H) && defined(RLIMIT_STACK) && !defined(NACL)
#define ECL_DEFAULT_C_STACK_SIZE 0 /* Use the stack size provided by the OS */
#else
#define ECL_DEFAULT_C_STACK_SIZE @ECL_DEFAULT_C_STACK_SIZE@
#endif