From 17bb77fd776ab39b7fb6b90c45feb6a7899a62ef Mon Sep 17 00:00:00 2001 From: nari Date: Thu, 7 Jul 2011 14:59:09 +0000 Subject: * 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 --- configure.in | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'configure.in') 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 -- cgit v1.2.3