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 static inline void
cont_restore_thread(rb_context_t *cont) 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 */ /* restore thread context */
if (cont->type == CONTINUATION_CONTEXT) { if (cont->type == CONTINUATION_CONTEXT) {
/* continuation */ /* continuation */
rb_thread_t *sth = &cont->saved_thread;
const rb_fiber_t *fib; const rb_fiber_t *fib;
th->fiber = sth->fiber; th->fiber = sth->fiber;
@ -613,17 +628,15 @@ cont_restore_thread(rb_context_t *cont)
th->ec.ensure_list = sth->ec.ensure_list; th->ec.ensure_list = sth->ec.ensure_list;
th->ec.errinfo = sth->ec.errinfo; th->ec.errinfo = sth->ec.errinfo;
th->ec.trace_arg = sth->ec.trace_arg; 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(th->ec.vm_stack != NULL);
VM_ASSERT(sth->status == THREAD_RUNNABLE); VM_ASSERT(sth->status == THREAD_RUNNABLE);
} }
else {
/* fiber */
fiber_restore_thread(th, (rb_fiber_t*)cont);
}
}
#if FIBER_USE_NATIVE #if FIBER_USE_NATIVE
#ifdef _WIN32 #ifdef _WIN32
@ -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; rb_thread_t *th = GET_THREAD(), *sth = &newfib->cont.saved_thread;
/* restore thread context */ /* restore thread context */
cont_restore_thread(&newfib->cont); fiber_restore_thread(th, newfib);
th->machine.stack_maxsize = sth->machine.stack_maxsize; th->machine.stack_maxsize = sth->machine.stack_maxsize;
if (sth->machine.stack_end && (newfib != oldfib)) { if (sth->machine.stack_end && (newfib != oldfib)) {
rb_bug("fiber_setcontext: sth->machine.stack_end has non zero value"); rb_bug("fiber_setcontext: sth->machine.stack_end has non zero value");