diff options
author | nari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-07 14:59:09 +0000 |
---|---|---|
committer | nari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-07 14:59:09 +0000 |
commit | 17bb77fd776ab39b7fb6b90c45feb6a7899a62ef (patch) | |
tree | ad7ba4b3d6039b96ffab7234ba20a09b4cf5c1dd /configure.in | |
parent | 68a0d412dd36b0caf1551089d8e6c64819854b6f (diff) |
* gc.c: change water_mark value value that may call
gc_mark(lev <= GC_LEVEL_MAX) in gc_mark().
In ruby_stack_check(), water_mark is a value that may call some
C function. Fixes Bug #3781
* configure.in: define GC_MARK_STACKFRAME_WORD that approximate
size of gc_mark() and gc_mark_children() stackframes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32438 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'configure.in')
-rw-r--r-- | configure.in | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/configure.in b/configure.in index 2185174851..81bc57eeb2 100644 --- a/configure.in +++ b/configure.in @@ -1230,6 +1230,63 @@ if test $rb_cv_stack_end_address != no; then AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address) fi +AC_CACHE_CHECK(for gc_mark and gc_children stack frame approximate size(word), rb_cv_gc_mark_stackframe_word, +[save_CFLAGS="$CFLAGS" +CFLAGS="-O0" +AC_TRY_RUN([ +int word; +void *stack_start; + +void +set_stackframe_word() +{ + int dumy = 42; + int diff; + + if (stack_start < (void *)&dumy) { + diff = (int)((void *)&dumy - stack_start); + } + else { + diff = (int)(stack_start - (void *)&dumy); + } + word = (diff/sizeof(void *)); + if ((diff % sizeof(void *)) != 0) { + word++; + } +} + +void +gc_mark_children(void *p1, void *p2, int lev) +{ + void *obj = p2; + + set_stackframe_word(p1,p2,lev); +} + +void +gc_mark(void *p1, void *p2, int lev) +{ + void *obj = p2; + + gc_mark_children(p1,p2,lev++); +} + +int +main() { + int dumy = 42; + + stack_start = (void *)&dumy; + gc_mark(0, 0, 255); + return word; +} +], + [rb_cv_gc_mark_stackframe_word="$?"], + [rb_cv_gc_mark_stackframe_word="$?"], + [rb_cv_gc_mark_stackframe_word="30"]) +CFLAGS="$save_CFLAGS"]) +AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word) + + dnl Checks for library functions. AC_TYPE_GETGROUPS AC_TYPE_SIGNAL |