Feature #10341 » 0002-Code-cleanup-in-fiber_switch-fiber_store.patch
| cont.c | ||
|---|---|---|
| 	th->root_fiber = th->fiber = fib->cont.self; | ||
|     } | ||
| #if !FIBER_USE_NATIVE | ||
|     cont_save_machine_stack(th, &fib->cont); | ||
| #endif | ||
|     if (FIBER_USE_NATIVE || ruby_setjmp(fib->cont.jmpbuf)) { | ||
| #if FIBER_USE_NATIVE | ||
| 	fiber_setcontext(next_fib, fib); | ||
|     fiber_setcontext(next_fib, fib); | ||
|     /* restored */ | ||
| #ifndef _WIN32 | ||
| 	if (terminated_machine_stack.ptr) { | ||
| 	    if (machine_stack_cache_index < MAX_MACHINE_STACK_CACHE) { | ||
| 		machine_stack_cache[machine_stack_cache_index].ptr = terminated_machine_stack.ptr; | ||
| 		machine_stack_cache[machine_stack_cache_index].size = terminated_machine_stack.size; | ||
| 		machine_stack_cache_index++; | ||
|     if (terminated_machine_stack.ptr) { | ||
| 	if (machine_stack_cache_index < MAX_MACHINE_STACK_CACHE) { | ||
| 	    machine_stack_cache[machine_stack_cache_index].ptr = terminated_machine_stack.ptr; | ||
| 	    machine_stack_cache[machine_stack_cache_index].size = terminated_machine_stack.size; | ||
| 	    machine_stack_cache_index++; | ||
| 	} | ||
| 	else { | ||
| 	    if (terminated_machine_stack.ptr != fib->cont.machine.stack) { | ||
| 		munmap((void*)terminated_machine_stack.ptr, terminated_machine_stack.size * sizeof(VALUE)); | ||
| 	    } | ||
| 	    else { | ||
| 		if (terminated_machine_stack.ptr != fib->cont.machine.stack) { | ||
| 		    munmap((void*)terminated_machine_stack.ptr, terminated_machine_stack.size * sizeof(VALUE)); | ||
| 		} | ||
| 		else { | ||
| 		    rb_bug("terminated fiber resumed"); | ||
| 		} | ||
| 		rb_bug("terminated fiber resumed"); | ||
| 	    } | ||
| 	    terminated_machine_stack.ptr = NULL; | ||
| 	    terminated_machine_stack.size = 0; | ||
| 	} | ||
| #endif | ||
| #endif | ||
| 	terminated_machine_stack.ptr = NULL; | ||
| 	terminated_machine_stack.size = 0; | ||
|     } | ||
|     GetFiberPtr(th->fiber, fib); | ||
|     if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value); | ||
|     return fib->cont.value; | ||
| #endif /* not _WIN32 */ | ||
| #else /* FIBER_USE_NATIVE */ | ||
|     cont_save_machine_stack(th, &fib->cont); | ||
|     if (ruby_setjmp(fib->cont.jmpbuf)) { | ||
| 	/* restored */ | ||
| 	GetFiberPtr(th->fiber, fib); | ||
| 	if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value); | ||
| 	if (nextfib->cont.value == Qundef) { | ||
| 	    cont_restore_0(nextfib->cont, &nextfib->cont.value); | ||
| 	    rb_bug("rb_fiber_resume: unreachable"); | ||
| 	} | ||
| 	return fib->cont.value; | ||
|     } | ||
| #if !FIBER_USE_NATIVE | ||
|     else { | ||
| 	return Qundef; | ||
| 	VALUE undef = Qundef; | ||
| 	cont_restore_0(nextfib->cont, &undef); | ||
| 	rb_bug("rb_fiber_resume: unreachable"); | ||
|     } | ||
| #endif | ||
| #endif /* FIBER_USE_NATIVE */ | ||
| } | ||
| static inline VALUE | ||
| ... | ... | |
|     } | ||
|     else if (fib->status == TERMINATED) { | ||
| 	value = rb_exc_new2(rb_eFiberError, "dead fiber called"); | ||
| 	if (th->fiber != fibval) { | ||
| 	    GetFiberPtr(th->fiber, fib); | ||
| 	    if (fib->status != TERMINATED) rb_exc_raise(value); | ||
| 	    fibval = th->root_fiber; | ||
| 	} | ||
| 	else { | ||
| 	    fibval = fib->prev; | ||
| 	    if (NIL_P(fibval)) fibval = th->root_fiber; | ||
| 	} | ||
| 	GetFiberPtr(fibval, fib); | ||
| 	GetFiberPtr(th->fiber, fib); | ||
| 	if (fib->status != TERMINATED) rb_exc_raise(value); | ||
| 	/* th->fiber is also dead => switch to root fiber */ | ||
| 	/* (this means we're being called from rb_fiber_terminate, */ | ||
| 	/* and the terminated fiber's return_fiber() is already dead) */ | ||
| 	GetFiberPtr(th->root_fiber, fib); | ||
| 	cont = &fib->cont; | ||
| 	cont->argc = -1; | ||
| 	cont->value = value; | ||
| #if FIBER_USE_NATIVE | ||
| 	{ | ||
| 	    VALUE oldfibval; | ||
| 	    VALUE oldfibval = th->fiber; | ||
| 	    rb_fiber_t *oldfib; | ||
| 	    oldfibval = rb_fiber_current(); | ||
| 	    GetFiberPtr(oldfibval, oldfib); | ||
| 	    fiber_setcontext(fib, oldfib); | ||
| 	} | ||
| #else | ||
| 	cont_restore_0(cont, &value); | ||
| #endif | ||
| 	/* unreachable */ | ||
|     } | ||
|     if (is_resume) { | ||
| ... | ... | |
|     cont->value = make_passing_arg(argc, argv); | ||
|     value = fiber_store(fib); | ||
| #if !FIBER_USE_NATIVE | ||
|     if (value == Qundef) { | ||
| 	cont_restore_0(cont, &value); | ||
| 	rb_bug("rb_fiber_resume: unreachable"); | ||
|     } | ||
| #endif | ||
|     RUBY_VM_CHECK_INTS(th); | ||
|     return value; | ||