diff options
author | wanabe <wanabe@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-11-02 09:35:43 +0000 |
---|---|---|
committer | wanabe <wanabe@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-11-02 09:35:43 +0000 |
commit | 2c2fb9c5ec1dff9b1dc4d53a78502fef2132e39d (patch) | |
tree | c1302ddab261e32c2e7d00ffdc2b2411a8acb44b /cont.c | |
parent | 9c173cd5884de39d5d1416a4c1af4f7bc6fc82b1 (diff) | |
download | ruby-2c2fb9c5ec1dff9b1dc4d53a78502fef2132e39d.tar.gz |
* cont.c (fiber_free): don't free unallocated local_storage. see #1325.
* cont.c (cont_init): clear local_storage not to use current thread's.
* cont.c (fiber_t_alloc, root_fiber_alloc): link itself always for
a case that fiber_link_remove() is called before fiber_link_join().
* cont.c (fiber_init): clear cont->vm_stack and th->stack before
root_fiber_alloc() in rb_fiber_current().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'cont.c')
-rw-r--r-- | cont.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -198,7 +198,8 @@ fiber_free(void *ptr) 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); @@ -283,6 +284,7 @@ cont_init(rb_context_t *cont, rb_thread_t *th) { /* save thread context */ cont->saved_thread = *th; + cont->saved_thread.local_storage = 0; } static rb_context_t * @@ -744,12 +746,15 @@ fiber_init(VALUE fibval, VALUE proc) rb_context_t *cont = &fib->cont; rb_thread_t *th = &cont->saved_thread; - fiber_link_join(fib); /* initialize cont */ cont->vm_stack = 0; th->stack = 0; + th->stack_size = 0; + + fiber_link_join(fib); + th->stack_size = FIBER_VM_STACK_SIZE; th->stack = ALLOC_N(VALUE, th->stack_size); |