@@ -171,6 +171,16 @@ fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c)
171
171
}
172
172
}
173
173
174
+ static void
175
+ fiber_switch_context (mrb_state * mrb , struct mrb_context * c )
176
+ {
177
+ if (mrb -> c -> fib ) {
178
+ mrb_write_barrier (mrb , (struct RBasic * )mrb -> c -> fib );
179
+ }
180
+ c -> status = MRB_FIBER_RUNNING ;
181
+ mrb -> c = c ;
182
+ }
183
+
174
184
static mrb_value
175
185
fiber_switch (mrb_state * mrb , mrb_value self , mrb_int len , const mrb_value * a , mrb_bool resume , mrb_bool vmexec )
176
186
{
@@ -207,9 +217,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
207
217
else {
208
218
value = fiber_result (mrb , a , len );
209
219
}
210
- mrb_write_barrier (mrb , (struct RBasic * )c -> fib );
211
- c -> status = MRB_FIBER_RUNNING ;
212
- mrb -> c = c ;
220
+ fiber_switch_context (mrb , c );
213
221
214
222
if (vmexec ) {
215
223
c -> vmexec = TRUE;
@@ -308,10 +316,8 @@ fiber_transfer(mrb_state *mrb, mrb_value self)
308
316
309
317
if (c == mrb -> root_c ) {
310
318
mrb -> c -> status = MRB_FIBER_TRANSFERRED ;
311
- mrb -> c = c ;
312
- c -> status = MRB_FIBER_RUNNING ;
319
+ fiber_switch_context (mrb , c );
313
320
MARK_CONTEXT_MODIFY (c );
314
- mrb_write_barrier (mrb , (struct RBasic * )c -> fib );
315
321
return fiber_result (mrb , a , len );
316
322
}
317
323
@@ -336,13 +342,12 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
336
342
fiber_check_cfunc (mrb , c );
337
343
c -> prev -> status = MRB_FIBER_RUNNING ;
338
344
c -> status = MRB_FIBER_SUSPENDED ;
339
- mrb -> c = c -> prev ;
345
+ fiber_switch_context ( mrb , c -> prev ) ;
340
346
c -> prev = NULL ;
341
347
if (c -> vmexec ) {
342
348
c -> vmexec = FALSE;
343
349
mrb -> c -> ci -> acc = CI_ACC_RESUMED ;
344
350
}
345
- mrb_write_barrier (mrb , (struct RBasic * )c -> fib );
346
351
MARK_CONTEXT_MODIFY (mrb -> c );
347
352
return fiber_result (mrb , a , len );
348
353
}
0 commit comments