From 404284674a5f68527947d893d4525e95dc2adc33 Mon Sep 17 00:00:00 2001 From: ko1 Date: Thu, 10 Aug 2017 06:01:57 +0000 Subject: [PATCH] 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 --- cont.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/cont.c b/cont.c index 19b15852ad..5f5ce63e3a 100644 --- a/cont.c +++ b/cont.c @@ -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; + + VM_ASSERT(th->ec.vm_stack != NULL); + VM_ASSERT(sth->status == THREAD_RUNNABLE); } else { /* fiber */ - th->ec = sth->ec; - sth->ec.vm_stack = NULL; - th->fiber = (rb_fiber_t*)cont; + fiber_restore_thread(th, (rb_fiber_t*)cont); } - - VM_ASSERT(th->ec.vm_stack != NULL); - VM_ASSERT(sth->status == THREAD_RUNNABLE); } #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");