summaryrefslogtreecommitdiff
path: root/configure.in
diff options
context:
space:
mode:
authornari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-07 14:59:09 +0000
committernari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-07 14:59:09 +0000
commit17bb77fd776ab39b7fb6b90c45feb6a7899a62ef (patch)
treead7ba4b3d6039b96ffab7234ba20a09b4cf5c1dd /configure.in
parent68a0d412dd36b0caf1551089d8e6c64819854b6f (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.in57
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