add scheme_init_stack_bounds

svn: r4070
This commit is contained in:
Matthew Flatt 2006-08-16 05:19:12 +00:00
parent 02079d2fe4
commit aa44cd0e0d
4 changed files with 71 additions and 59 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -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)

View File

@ -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