From e59b9d35fcd58331928aa1f62fe48287b0c643e2 Mon Sep 17 00:00:00 2001 From: mame Date: Tue, 27 Apr 2010 14:06:16 +0000 Subject: [PATCH] * insns.def (onceinlinecache): add exclusion control for a region between onceinlinecache and setinlinecache. [ruby-dev:39768] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ bootstraptest/test_thread.rb | 9 +++++++++ insns.def | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/ChangeLog b/ChangeLog index 387c5af448..2b113e3053 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Apr 27 22:55:29 2010 Yusuke Endoh + + * insns.def (onceinlinecache): add exclusion control for a region + between onceinlinecache and setinlinecache. [ruby-dev:39768] + Tue Apr 27 22:40:54 2010 Yusuke Endoh * iseq.c (set_relation): do not use top_wrapper as bottom of cref, diff --git a/bootstraptest/test_thread.rb b/bootstraptest/test_thread.rb index 56c77259cf..2494cccbf3 100644 --- a/bootstraptest/test_thread.rb +++ b/bootstraptest/test_thread.rb @@ -443,3 +443,12 @@ assert_equal 'ok', %q{ 'ok' end } + +assert_equal 'foo', %q{ + f = proc {|s| /#{ sleep 1; s }/o } + [ Thread.new { f.call("foo"); nil }, + Thread.new { sleep 0.5; f.call("bar"); nil }, + ].each {|t| t.join } + GC.start + f.call.source +} diff --git a/insns.def b/insns.def index 95414656bc..ba6f1d6627 100644 --- a/insns.def +++ b/insns.def @@ -1199,10 +1199,17 @@ onceinlinecache () (VALUE val) { + retry: if (ic->ic_vmstat) { val = ic->ic_value.value; JUMP(dst); } + else if (ic->ic_value.value == Qundef) + { + RUBY_VM_CHECK_INTS(); + rb_thread_schedule(); + goto retry; + } else { /* none */ ic->ic_value.value = Qundef;