summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-30 05:42:06 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-30 05:42:06 +0000
commit375dbe3c7364a0c8cd1ed6d51c5f2cabe8fa001e (patch)
tree6d3087b7c88d380efee5c8b90cee05e896e771d7 /ext
parent1b80bfa4692f6dcab6505610bb27d8dc593a132a (diff)
* ext/dl/mkcallback.rb (rb_dl_init_callbacks): avoid GC problem which
is caused by 'GC.stress=true; require "dl"'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/dl/mkcallback.rb21
1 files changed, 13 insertions, 8 deletions
diff --git a/ext/dl/mkcallback.rb b/ext/dl/mkcallback.rb
index 21fb177f8b..4dbd0d6ef6 100644
--- a/ext/dl/mkcallback.rb
+++ b/ext/dl/mkcallback.rb
@@ -135,16 +135,21 @@ $out << (<<EOS)
static void
rb_dl_init_callbacks()
{
+ VALUE tmp;
cb_call = rb_intern("call");
- rb_DLCdeclCallbackProcs = rb_ary_new();
- rb_DLCdeclCallbackAddrs = rb_ary_new();
- rb_DLStdcallCallbackProcs = rb_ary_new();
- rb_DLStdcallCallbackAddrs = rb_ary_new();
- rb_define_const(rb_mDL, "CdeclCallbackProcs", rb_DLCdeclCallbackProcs);
- rb_define_const(rb_mDL, "CdeclCallbackAddrs", rb_DLCdeclCallbackAddrs);
- rb_define_const(rb_mDL, "StdcallCallbackProcs", rb_DLStdcallCallbackProcs);
- rb_define_const(rb_mDL, "StdcallCallbackAddrs", rb_DLStdcallCallbackAddrs);
+ tmp = rb_DLCdeclCallbackProcs = rb_ary_new();
+ rb_define_const(rb_mDL, "CdeclCallbackProcs", tmp);
+
+ tmp = rb_DLCdeclCallbackAddrs = rb_ary_new();
+ rb_define_const(rb_mDL, "CdeclCallbackAddrs", tmp);
+
+ tmp = rb_DLStdcallCallbackProcs = rb_ary_new();
+ rb_define_const(rb_mDL, "StdcallCallbackProcs", tmp);
+
+ tmp = rb_DLStdcallCallbackAddrs = rb_ary_new();
+ rb_define_const(rb_mDL, "StdcallCallbackAddrs", tmp);
+
#{
(0...MAX_DLTYPE).collect{|ty|
sprintf(" rb_ary_push(rb_DLCdeclCallbackProcs, rb_ary_new3(%d,%s));",