Bug #9905 ยป sp_and_size_for_fiber.patch
| cont.c (working copy) | ||
|---|---|---|
|
void *fib_handle;
|
||
|
#else
|
||
|
ucontext_t context;
|
||
|
/* Because context.uc_stack.ss_sp and context.uc_stack.ss_size
|
||
|
* are not necessarily valid after makecontext() or swapcontext(),
|
||
|
* they are saved in these variables for later use.
|
||
|
*/
|
||
|
void *ss_sp;
|
||
|
size_t ss_size;
|
||
|
#endif
|
||
|
#endif
|
||
|
} rb_fiber_t;
|
||
| ... | ... | |
|
#else /* not WIN32 */
|
||
|
if (GET_THREAD()->fiber != cont->self) {
|
||
|
rb_fiber_t *fib = (rb_fiber_t*)cont;
|
||
|
if (fib->context.uc_stack.ss_sp) {
|
||
|
if (fib->ss_sp) {
|
||
|
if (cont->type == ROOT_FIBER_CONTEXT) {
|
||
|
rb_bug("Illegal root fiber parameter");
|
||
|
}
|
||
|
munmap((void*)fib->context.uc_stack.ss_sp, fib->context.uc_stack.ss_size);
|
||
|
munmap((void*)fib->ss_sp, fib->ss_size);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
| ... | ... | |
|
context->uc_link = NULL;
|
||
|
context->uc_stack.ss_sp = ptr;
|
||
|
context->uc_stack.ss_size = size;
|
||
|
fib->ss_sp = ptr;
|
||
|
fib->ss_size = size;
|
||
|
makecontext(context, rb_fiber_start, 0);
|
||
|
sth->machine.stack_start = (VALUE*)(ptr + STACK_DIR_UPPER(0, size));
|
||
|
sth->machine.stack_maxsize = size - RB_PAGE_SIZE;
|
||
| ... | ... | |
|
fib->status = TERMINATED;
|
||
|
#if FIBER_USE_NATIVE && !defined(_WIN32)
|
||
|
/* Ruby must not switch to other thread until storing terminated_machine_stack */
|
||
|
terminated_machine_stack.ptr = fib->context.uc_stack.ss_sp;
|
||
|
terminated_machine_stack.size = fib->context.uc_stack.ss_size / sizeof(VALUE);
|
||
|
terminated_machine_stack.ptr = fib->ss_sp;
|
||
|
terminated_machine_stack.size = fib->ss_size / sizeof(VALUE);
|
||
|
fib->ss_sp = NULL;
|
||
|
fib->context.uc_stack.ss_sp = NULL;
|
||
|
fib->cont.machine.stack = NULL;
|
||
|
fib->cont.machine.stack_size = 0;
|
||