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

introduce fiber_restore_thread.

* cont.c (fiber_restore_thread): added (separate from cont_restore_thread).

* cont.c (fiber_setcontext): call fiber_restore_thread() directly.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59565 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2017-08-10 06:01:57 +00:00
parent 157ee2bdbc
commit 404284674a

31
cont.c
View file

@ -577,14 +577,29 @@ cont_capture(volatile int *volatile stat)
}
}
static inline void
fiber_restore_thread(rb_thread_t *th, rb_fiber_t *fib)
{
rb_thread_t *sth = &fib->cont.saved_thread;
th->ec = sth->ec;
sth->ec.vm_stack = NULL;
th->fiber = fib;
VM_ASSERT(th->ec.vm_stack != NULL);
VM_ASSERT(sth->status == THREAD_RUNNABLE);
}
static inline void
cont_restore_thread(rb_context_t *cont)
{
rb_thread_t *th = GET_THREAD(), *sth = &cont->saved_thread;
rb_thread_t *th = GET_THREAD();
/* restore thread context */
if (cont->type == CONTINUATION_CONTEXT) {
/* continuation */
rb_thread_t *sth = &cont->saved_thread;
const rb_fiber_t *fib;
th->fiber = sth->fiber;
@ -613,16 +628,14 @@ cont_restore_thread(rb_context_t *cont)
th->ec.ensure_list = sth->ec.ensure_list;
th->ec.errinfo = sth->ec.errinfo;
th->ec.trace_arg = sth->ec.trace_arg;
}
else {
/* fiber */
th->ec = sth->ec;
sth->ec.vm_stack = NULL;
th->fiber = (rb_fiber_t*)cont;
}
VM_ASSERT(th->ec.vm_stack != NULL);
VM_ASSERT(sth->status == THREAD_RUNNABLE);
}
else {
/* fiber */
fiber_restore_thread(th, (rb_fiber_t*)cont);
}
}
#if FIBER_USE_NATIVE
@ -743,7 +756,7 @@ fiber_setcontext(rb_fiber_t *newfib, rb_fiber_t *oldfib)
rb_thread_t *th = GET_THREAD(), *sth = &newfib->cont.saved_thread;
/* restore thread context */
cont_restore_thread(&newfib->cont);
fiber_restore_thread(th, newfib);
th->machine.stack_maxsize = sth->machine.stack_maxsize;
if (sth->machine.stack_end && (newfib != oldfib)) {
rb_bug("fiber_setcontext: sth->machine.stack_end has non zero value");