Index: cont.c =================================================================== --- cont.c (revision 25392) +++ cont.c (working copy) @@ -198,7 +198,8 @@ if (ptr) { rb_fiber_t *fib = ptr; - if (fib->cont.type != ROOT_FIBER_CONTEXT) { + if (fib->cont.type != ROOT_FIBER_CONTEXT && + fib->cont.saved_thread.local_storage) { st_free_table(fib->cont.saved_thread.local_storage); } fiber_link_remove(fib); @@ -731,6 +732,7 @@ cont_init(&fib->cont, th); fib->prev = Qnil; fib->status = CREATED; + fib->prev_fiber = fib->next_fiber = fib; DATA_PTR(fibval) = fib; @@ -744,8 +746,6 @@ rb_context_t *cont = &fib->cont; rb_thread_t *th = &cont->saved_thread; - fiber_link_join(fib); - /* initialize cont */ cont->vm_stack = 0; @@ -753,6 +753,8 @@ th->stack_size = FIBER_VM_STACK_SIZE; th->stack = ALLOC_N(VALUE, th->stack_size); + fiber_link_join(fib); + th->cfp = (void *)(th->stack + th->stack_size); th->cfp--; th->cfp->pc = 0;