diff --git a/racket/src/racket/sconfig.h b/racket/src/racket/sconfig.h index 898fab8c5a..3abd64aa20 100644 --- a/racket/src/racket/sconfig.h +++ b/racket/src/racket/sconfig.h @@ -322,15 +322,12 @@ # endif # include -# if OpenBSD < 201211 -/* This is needed for (pre-5.2) userspace threads: */ -# define ASSUME_FIXED_STACK_SIZE -# define FIXED_STACK_SIZE 1048576 -# endif # include "uconfig.h" # undef HAS_STANDARD_IOB # define HAS_BSD_IOB +# undef UNIX_FIND_STACK_BOUNDS +# define PTHREAD_STACKSEG_FIND_STACK_BOUNDS /* Default UNIX_STACK_MAXIMUM is too big for a non-root user. */ # undef UNIX_STACK_MAXIMUM @@ -1515,6 +1512,8 @@ line. ASSUME_FIXED_STACK_SIZE assumes that the main stack size is always FIXED_STACK_SIZE. + PTHREAD_STACKSEG_FIND_STACK_BOUNDS finds stack bounds using + pthread_stackseg_np(). Use only one of these if DO_STACK_CHECK is used, or none otherwise. */ /* FIXED_STACK_SIZE sets the stack size to when the diff --git a/racket/src/racket/src/eval.c b/racket/src/racket/src/eval.c index 02719e9705..2ab4aea549 100644 --- a/racket/src/racket/src/eval.c +++ b/racket/src/racket/src/eval.c @@ -144,6 +144,11 @@ #include #include #endif +#ifdef PTHREAD_STACKSEG_FIND_STACK_BOUNDS +# include +# include +# include +#endif #ifdef WINDOWS_FIND_STACK_BOUNDS #include #endif @@ -595,9 +600,6 @@ void scheme_init_stack_check() { int *v, stack_grows_up; uintptr_t deeper; -#ifdef UNIX_FIND_STACK_BOUNDS - struct rlimit rl; -#endif deeper = scheme_get_deeper_address(); stack_grows_up = (deeper > (uintptr_t)&v); @@ -665,12 +667,14 @@ void scheme_init_stack_check() # endif # ifdef UNIX_FIND_STACK_BOUNDS - getrlimit(RLIMIT_STACK, &rl); - { + struct rlimit rl; uintptr_t bnd, lim; + bnd = (uintptr_t)scheme_get_current_os_thread_stack_base(); + getrlimit(RLIMIT_STACK, &rl); + # ifdef LINUX_FIND_STACK_BASE bnd = adjust_stack_base(bnd); # endif @@ -689,6 +693,14 @@ void scheme_init_stack_check() scheme_stack_boundary = bnd; } # endif + +# ifdef PTHREAD_STACKSEG_FIND_STACK_BOUNDS + { + stack_t stack; + pthread_stackseg_np(pthread_self(), &stack); + scheme_stack_boundary = (uintptr_t)((char *)stack.ss_sp - (stack.ss_size - STACK_SAFETY_MARGIN)); + } +# endif } #endif diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 23376b12eb..9c27d20790 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -28,7 +28,7 @@ #include "schmach.h" #include "schexpobs.h" -#define MIN(l,o) ((l) < (o) ? (l) : (o)) +#define mz_MIN(l,o) ((l) < (o) ? (l) : (o)) /* globals */ SHARED_OK Scheme_Object *(*scheme_module_demand_hook)(int, Scheme_Object **); @@ -3673,7 +3673,7 @@ int scheme_resolved_module_path_value_matches(Scheme_Object *rmp, Scheme_Object else if (SCHEME_BYTE_STRINGP(rmp_val) && SCHEME_SYMBOLP(o)) { return !strncmp(SCHEME_BYTE_STR_VAL(rmp_val), SCHEME_SYM_VAL(o), - MIN(SCHEME_BYTE_STRLEN_VAL(rmp_val), SCHEME_SYM_LEN(o))); + mz_MIN(SCHEME_BYTE_STRLEN_VAL(rmp_val), SCHEME_SYM_LEN(o))); } else { scheme_arg_mismatch("scheme_resolved_module_path_value_matches", "internal error: unknown type of resolved_module_path_value", diff --git a/racket/src/racket/src/mzstkchk.h b/racket/src/racket/src/mzstkchk.h index fbe2fc6e36..402af226a8 100644 --- a/racket/src/racket/src/mzstkchk.h +++ b/racket/src/racket/src/mzstkchk.h @@ -21,7 +21,7 @@ # if defined(UNIX_FIND_STACK_BOUNDS) || defined(WINDOWS_FIND_STACK_BOUNDS) \ || defined(MACOS_FIND_STACK_BOUNDS) || defined(ASSUME_FIXED_STACK_SIZE) \ || defined(BEOS_FIND_STACK_BOUNDS) || defined(OSKIT_FIXED_STACK_BOUNDS) \ - || defined(PALM_FIND_STACK_BOUNDS) + || defined(PALM_FIND_STACK_BOUNDS) || defined(PTHREAD_STACKSEG_FIND_STACK_BOUNDS) uintptr_t _stk_pos; _stk_pos = (uintptr_t)&_stk_pos; diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index d2697c94e9..798147fad6 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -1705,7 +1705,7 @@ typedef struct Scheme_Overflow { #if defined(UNIX_FIND_STACK_BOUNDS) || defined(WINDOWS_FIND_STACK_BOUNDS) \ || defined(MACOS_FIND_STACK_BOUNDS) || defined(ASSUME_FIXED_STACK_SIZE) \ || defined(BEOS_FIND_STACK_BOUNDS) || defined(OSKIT_FIXED_STACK_BOUNDS) \ - || defined(PALM_FIND_STACK_BOUNDS) + || defined(PALM_FIND_STACK_BOUNDS) || defined(PTHREAD_STACKSEG_FIND_STACK_BOUNDS) # define USE_STACK_BOUNDARY_VAR THREAD_LOCAL_DECL(extern uintptr_t scheme_stack_boundary); /* Same as scheme_stack_boundary, but set to an extreme value when feul auto-expires,