diff --git a/src/acconfig.h b/src/acconfig.h index e8173d2e36e566910a9c9220e1c7451528be30c9..6ad811fd01e9068e7f358f4bb0cb6a3f50d2dcee 100644 --- a/src/acconfig.h +++ b/src/acconfig.h @@ -1,5 +1,5 @@ /* - * $Id: acconfig.h,v 1.55 2000/03/25 23:43:25 hubbe Exp $ + * $Id: acconfig.h,v 1.56 2000/03/28 08:10:53 hubbe Exp $ */ #ifndef MACHINE_H #define MACHINE_H @@ -104,6 +104,12 @@ */ #undef STACK_DIRECTION +/* Define this to the number of KB in the initial stack, + * currently this is 1 Mb on FreeBSD, 2Mb on Linux and + * unlimited (undefined) everywhere else + */ +#undef Pike_INITIAL_STACK_SIZE + /* If so, is it restricted to user and system time? */ #undef GETRUSAGE_RESTRICTED diff --git a/src/configure.in b/src/configure.in index ddaaae82e14c7ac8091a71dadc23a55337f00b19..a10f5f0be48aba436d5379890186c13c947e961c 100644 --- a/src/configure.in +++ b/src/configure.in @@ -1,4 +1,4 @@ -AC_REVISION("$Id: configure.in,v 1.357 2000/03/27 17:05:32 grubba Exp $") +AC_REVISION("$Id: configure.in,v 1.358 2000/03/28 08:10:53 hubbe Exp $") AC_INIT(interpret.c) AC_CONFIG_HEADER(machine.h) @@ -1373,6 +1373,51 @@ int main(int argc, char **argv) if test "x$PTHREAD_CONFIG" = xno ; then CFLAGS="${CFLAGS} -pthread" LD_FALLBACK_FLAGS="${LD_FALLBACK_FLAGS-} -lc_r" + + AC_MSG_CHECKING(Initial stack limit) + AC_CACHE_VAL(pike_cv_initial_stack_size,[ + AC_TRY_RUN([ +#include <stdio.h> + +static int depth=0; +FILE *f; + +void save_depth(void); + +void use_stack(void *page) +{ + void *X[8190]; + X[0]=page; + save_depth(); + use_stack(&X); +} + +void save_depth(void) +{ + depth+=sizeof(void *)*8192; + fprintf(f,"%d\n",depth); + fflush(f); + if(depth>0x80000000) exit(0); +} + +int main(int argc) +{ + f=fopen("confdefs.out.2","w"); /* weird filename to circumvent configure weirdness */ + save_depth(); + use_stack(0); +} +], +pike_cv_initial_stack_size='', +while read x; do pike_cv_initial_stack_size=$x ; done <confdefs.out.2) +rm confdefs.out.2 >/dev/null 2>/dev/null || : +]) + if test x$pike_cv_initial_stack_size = x ; then + AC_MSG_RESULT(unlimited) + else + AC_MSG_RESULT($pike_cv_initial_stack_size) + AC_DEFINE_UNQUOTED(Pike_INITIAL_STACK_SIZE,$pike_cv_initial_stack_size) + fi + else CFLAGS="$CFLAGS `pthread-config --cflags`" LIBS="$LIBS `pthread-config --libs`" @@ -3260,6 +3305,9 @@ AC_CACHE_VAL(pike_cv_sys_ccshared,[ esac else case $pike_cv_sys_os in + IRIX*) + AC_SYS_COMPILER_FLAG(-share,cc_shared,CCSHARED) + ;; hp*|HP*) CCSHARED="+z"; ;; FreeBSD*) CCSHARED="-fpic";; SCO_SV*) CCSHARED="-KPIC -dy -Bdynamic";; diff --git a/src/main.c b/src/main.c index 2857c65838fc91e9e829f2cc326ecb5a27544ae0..8df667cc1b1ec86a4627217d01db6497207c36b5 100644 --- a/src/main.c +++ b/src/main.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: main.c,v 1.83 2000/03/08 00:09:49 hubbe Exp $"); +RCSID("$Id: main.c,v 1.84 2000/03/28 08:10:53 hubbe Exp $"); #include "fdlib.h" #include "backend.h" #include "module.h" @@ -415,6 +415,12 @@ int dbm_main(int argc, char **argv) if(lim.rlim_cur == RLIM_INFINITY) lim.rlim_cur=1024*1024*32; #endif + +#ifdef Pike_INITIAL_STACK_SIZE + if(lim.rlim_cur > Pike_INITIAL_STACK_SIZE) + lim.rlim_cur=Pike_INITIAL_STACK_SIZE; +#endif + stack_top += STACK_DIRECTION * lim.rlim_cur; #ifdef HAVE_PTHREAD_INITIAL_THREAD_BOS