aboutsummaryrefslogtreecommitdiffstats
path: root/cont.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-10 06:01:57 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-10 06:01:57 +0000
commit2eda133d50ec584882671aaa1364861c4e47b335 (patch)
treeb078181b3b4ba717a98121b9cb770132f2f02733 /cont.c
parent39de088e8860b55443962ab7f31efe94a766f50c (diff)
downloadruby-2eda133d50ec584882671aaa1364861c4e47b335.tar.gz
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
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/cont.c b/cont.c
index 19b15852ad..5f5ce63e3a 100644
--- a/cont.c
+++ b/cont.c
@@ -578,13 +578,28 @@ 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");