1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

introduce rb_fiber_t::first_proc.

* cont.c (rb_fiber_t): add rb_fiber_t::first_proc and do not use
  rb_thread_t::first_proc which should be thread local.
  [Bug #13689]

* test/ruby/test_thread.rb: test for [Bug #13689].


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59200 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2017-06-28 15:25:30 +00:00
parent 8dd9c12c58
commit 5041f548dd
2 changed files with 18 additions and 6 deletions

11
cont.c
View file

@ -125,6 +125,7 @@ static machine_stack_cache_t terminated_machine_stack;
struct rb_fiber_struct {
rb_context_t cont;
VALUE first_proc;
struct rb_fiber_struct *prev;
enum fiber_status status;
/* If a fiber invokes "transfer",
@ -308,6 +309,7 @@ fiber_mark(void *ptr)
{
rb_fiber_t *fib = ptr;
RUBY_MARK_ENTER("cont");
rb_gc_mark(fib->first_proc);
rb_fiber_mark_self(fib->prev);
cont_mark(&fib->cont);
RUBY_MARK_LEAVE("cont");
@ -412,7 +414,6 @@ cont_save_thread(rb_context_t *cont, rb_thread_t *th)
/* save thread context */
sth->ec = th->ec;
sth->first_proc = th->first_proc;
/* saved_thread->machine.stack_(start|end) should be NULL */
/* because it may happen GC afterward */
@ -555,8 +556,6 @@ cont_restore_thread(rb_context_t *cont)
th->fiber = (rb_fiber_t*)cont;
}
th->first_proc = sth->first_proc;
VM_ASSERT(sth->status == THREAD_RUNNABLE);
}
@ -1217,7 +1216,7 @@ fiber_init(VALUE fibval, VALUE proc)
th->ec.local_storage_recursive_hash = Qnil;
th->ec.local_storage_recursive_hash_for_trace = Qnil;
th->first_proc = proc;
fib->first_proc = proc;
#if !FIBER_USE_NATIVE
MEMCPY(&cont->jmpbuf, &cth->root_jmpbuf, rb_jmpbuf_t, 1);
@ -1254,11 +1253,11 @@ rb_fiber_start(void)
rb_context_t *cont = &VAR_FROM_MEMORY(fib)->cont;
int argc;
const VALUE *argv, args = cont->value;
GetProcPtr(cont->saved_thread.first_proc, proc);
GetProcPtr(fib->first_proc, proc);
argv = (argc = cont->argc) > 1 ? RARRAY_CONST_PTR(args) : &args;
cont->value = Qnil;
th->ec.errinfo = Qnil;
th->ec.root_lep = rb_vm_proc_local_ep(cont->saved_thread.first_proc);
th->ec.root_lep = rb_vm_proc_local_ep(fib->first_proc);
th->ec.root_svar = Qfalse;
fib->status = FIBER_RUNNING;

View file

@ -34,6 +34,19 @@ class TestThread < Test::Unit::TestCase
th.join
end
def test_inspect_with_fiber
inspect1 = inspect2 = nil
Thread.new{
inspect1 = Thread.current.inspect
Fiber.new{
inspect2 = Thread.current.inspect
}.resume
}.join
assert_equal inspect1, inspect2, '[Bug #13689]'
end
def test_main_thread_variable_in_enumerator
assert_equal Thread.main, Thread.current