add scheme_init_stack_bounds
svn: r4070
This commit is contained in:
parent
02079d2fe4
commit
aa44cd0e0d
|
@ -1615,9 +1615,8 @@ MZ_EXTERN int (*scheme_actual_main)(int argc, char **argv);
|
|||
MZ_EXTERN void scheme_set_actual_main(int (*m)(int argc, char **argv));
|
||||
|
||||
/* GC registration: */
|
||||
#ifdef GC_MIGHT_USE_REGISTERED_STATICS
|
||||
MZ_EXTERN void scheme_set_stack_base(void *base, int no_auto_statics);
|
||||
#endif
|
||||
MZ_EXTERN void scheme_set_stack_bounds(void *base, void *deepest, int no_auto_statics);
|
||||
|
||||
MZ_EXTERN void scheme_register_static(void *ptr, long size);
|
||||
#if defined(MUST_REGISTER_GLOBALS) || defined(GC_MIGHT_USE_REGISTERED_STATICS)
|
||||
|
|
|
@ -238,10 +238,7 @@ static Scheme_Object *scheme_compile_expand_expr(Scheme_Object *form, Scheme_Com
|
|||
|
||||
typedef void (*DW_PrePost_Proc)(void *);
|
||||
|
||||
#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)
|
||||
#ifdef USE_STACK_BOUNDARY_VAR
|
||||
unsigned long scheme_stack_boundary;
|
||||
#endif
|
||||
|
||||
|
@ -577,62 +574,66 @@ void scheme_init_stack_check()
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef ASSUME_FIXED_STACK_SIZE
|
||||
scheme_stack_boundary = scheme_get_stack_base();
|
||||
if (stack_grows_up)
|
||||
scheme_stack_boundary += (FIXED_STACK_SIZE - STACK_SAFETY_MARGIN);
|
||||
else
|
||||
scheme_stack_boundary += (STACK_SAFETY_MARGIN - FIXED_STACK_SIZE);
|
||||
#endif
|
||||
|
||||
#ifdef WINDOWS_FIND_STACK_BOUNDS
|
||||
scheme_stack_boundary = scheme_get_stack_base();
|
||||
scheme_stack_boundary += (STACK_SAFETY_MARGIN - 0x100000);
|
||||
#endif
|
||||
|
||||
#ifdef MACOS_FIND_STACK_BOUNDS
|
||||
scheme_stack_boundary = (unsigned long)&v + STACK_SAFETY_MARGIN - StackSpace();
|
||||
#endif
|
||||
|
||||
#ifdef PALMOS_FIND_STACK_BOUNDS
|
||||
{
|
||||
Ptr s, e;
|
||||
SysGetStackInfo(Ptr &s, &e);
|
||||
scheme_stack_boundary = (unsigned long)e + STACK_SAFETY_MARGIN;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BEOS_FIND_STACK_BOUNDS
|
||||
{
|
||||
thread_info info;
|
||||
get_thread_info(find_thread(NULL), &info);
|
||||
scheme_stack_boundary = (unsigned long)info.stack_base + STACK_SAFETY_MARGIN;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OSKIT_FIXED_STACK_BOUNDS
|
||||
scheme_stack_boundary = (unsigned long)base_stack_start + STACK_SAFETY_MARGIN;
|
||||
#endif
|
||||
|
||||
#ifdef UNIX_FIND_STACK_BOUNDS
|
||||
getrlimit(RLIMIT_STACK, &rl);
|
||||
|
||||
{
|
||||
unsigned long bnd, lim;
|
||||
bnd = (unsigned long)scheme_get_stack_base();
|
||||
|
||||
lim = (unsigned long)rl.rlim_cur;
|
||||
# ifdef UNIX_STACK_MAXIMUM
|
||||
if (lim > UNIX_STACK_MAXIMUM)
|
||||
lim = UNIX_STACK_MAXIMUM;
|
||||
#ifdef USE_STACK_BOUNDARY_VAR
|
||||
if (!scheme_stack_boundary) {
|
||||
# ifdef ASSUME_FIXED_STACK_SIZE
|
||||
scheme_stack_boundary = scheme_get_stack_base();
|
||||
if (stack_grows_up)
|
||||
scheme_stack_boundary += (FIXED_STACK_SIZE - STACK_SAFETY_MARGIN);
|
||||
else
|
||||
scheme_stack_boundary += (STACK_SAFETY_MARGIN - FIXED_STACK_SIZE);
|
||||
# endif
|
||||
|
||||
if (stack_grows_up)
|
||||
bnd += (lim - STACK_SAFETY_MARGIN);
|
||||
else
|
||||
bnd += (STACK_SAFETY_MARGIN - lim);
|
||||
# ifdef WINDOWS_FIND_STACK_BOUNDS
|
||||
scheme_stack_boundary = scheme_get_stack_base();
|
||||
scheme_stack_boundary += (STACK_SAFETY_MARGIN - 0x100000);
|
||||
# endif
|
||||
|
||||
scheme_stack_boundary = bnd;
|
||||
# ifdef MACOS_FIND_STACK_BOUNDS
|
||||
scheme_stack_boundary = (unsigned long)&v + STACK_SAFETY_MARGIN - StackSpace();
|
||||
# endif
|
||||
|
||||
# ifdef PALMOS_FIND_STACK_BOUNDS
|
||||
{
|
||||
Ptr s, e;
|
||||
SysGetStackInfo(Ptr &s, &e);
|
||||
scheme_stack_boundary = (unsigned long)e + STACK_SAFETY_MARGIN;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef BEOS_FIND_STACK_BOUNDS
|
||||
{
|
||||
thread_info info;
|
||||
get_thread_info(find_thread(NULL), &info);
|
||||
scheme_stack_boundary = (unsigned long)info.stack_base + STACK_SAFETY_MARGIN;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef OSKIT_FIXED_STACK_BOUNDS
|
||||
scheme_stack_boundary = (unsigned long)base_stack_start + STACK_SAFETY_MARGIN;
|
||||
# endif
|
||||
|
||||
# ifdef UNIX_FIND_STACK_BOUNDS
|
||||
getrlimit(RLIMIT_STACK, &rl);
|
||||
|
||||
{
|
||||
unsigned long bnd, lim;
|
||||
bnd = (unsigned long)scheme_get_stack_base();
|
||||
|
||||
lim = (unsigned long)rl.rlim_cur;
|
||||
# ifdef UNIX_STACK_MAXIMUM
|
||||
if (lim > UNIX_STACK_MAXIMUM)
|
||||
lim = UNIX_STACK_MAXIMUM;
|
||||
# endif
|
||||
|
||||
if (stack_grows_up)
|
||||
bnd += (lim - STACK_SAFETY_MARGIN);
|
||||
else
|
||||
bnd += (STACK_SAFETY_MARGIN - lim);
|
||||
|
||||
scheme_stack_boundary = bnd;
|
||||
}
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -79,6 +79,17 @@ void scheme_set_stack_base(void *base, int no_auto_statics)
|
|||
use_registered_statics = no_auto_statics;
|
||||
}
|
||||
|
||||
void scheme_set_stack_bounds(void *base, void *deepest, int no_auto_statics)
|
||||
{
|
||||
scheme_set_stack_base(base, no_auto_statics);
|
||||
|
||||
#ifdef USE_STACK_BOUNDARY_VAR
|
||||
if (deepest) {
|
||||
scheme_stack_boundary = (unsigned long)deepest;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
extern unsigned long scheme_get_stack_base()
|
||||
{
|
||||
#if !defined(MZ_PRECISE_GC) && !defined(USE_SENORA_GC)
|
||||
|
|
|
@ -1003,6 +1003,7 @@ typedef struct Scheme_Overflow {
|
|||
|| 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)
|
||||
# define USE_STACK_BOUNDARY_VAR
|
||||
extern unsigned long scheme_stack_boundary;
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user