From c26c51449461e3c8ee9bb4e1800933fb3d3caf67 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Thu, 20 Jun 2019 15:30:29 +1200 Subject: Revert failed attempt at fixing invalid usage of vm_stack. --- cont.c | 11 +++++++++-- thread.c | 17 ++++------------- vm.c | 34 +++++++++------------------------- vm_core.h | 4 ---- 4 files changed, 22 insertions(+), 44 deletions(-) diff --git a/cont.c b/cont.c index b83a0ad94c..0c8a68fe9a 100644 --- a/cont.c +++ b/cont.c @@ -268,6 +268,13 @@ fiber_status_set(rb_fiber_t *fib, enum fiber_status s) fib->status = s; } +void +rb_ec_set_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size) +{ + ec->vm_stack = stack; + ec->vm_stack_size = size; +} + static inline void ec_switch(rb_thread_t *th, rb_fiber_t *fib) { @@ -698,7 +705,7 @@ cont_capture(volatile int *volatile stat) cont->saved_vm_stack.ptr = ALLOC_N(VALUE, ec->vm_stack_size); MEMCPY(cont->saved_vm_stack.ptr, ec->vm_stack, VALUE, ec->vm_stack_size); #endif - rb_ec_clear_vm_stack(&cont->saved_ec); + rb_ec_set_vm_stack(&cont->saved_ec, NULL, 0); cont_save_machine_stack(th, cont); /* backup ensure_list to array for search in another context */ @@ -1786,7 +1793,7 @@ rb_fiber_close(rb_fiber_t *fib) } } - rb_ec_clear_vm_stack(ec); + rb_ec_set_vm_stack(ec, NULL, 0); #if !FIBER_USE_NATIVE /* should not mark machine stack any more */ diff --git a/thread.c b/thread.c index 8953c270bb..7cb8062075 100644 --- a/thread.c +++ b/thread.c @@ -596,11 +596,7 @@ thread_cleanup_func_before_exec(void *th_ptr) { rb_thread_t *th = th_ptr; th->status = THREAD_KILLED; - // The thread stack doesn't exist in the forked process: th->ec->machine.stack_start = th->ec->machine.stack_end = NULL; - - // The vm_stack is `alloca`ed on the thread stack, so it's gone too: - rb_ec_clear_vm_stack(th->ec); } static void @@ -717,19 +713,19 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) rb_bug("thread_start_func_2 must not be used for main thread"); } - thread_debug("thread start: %p\n", (void *)th); - VM_ASSERT((size * sizeof(VALUE)) <= th->ec->machine.stack_maxsize); - vm_stack = alloca(size * sizeof(VALUE)); VM_ASSERT(vm_stack); gvl_acquire(th->vm, th); rb_ec_initialize_vm_stack(th->ec, vm_stack, size); + + ruby_thread_set_native(th); + th->ec->machine.stack_start = STACK_DIR_UPPER(vm_stack + size, vm_stack); th->ec->machine.stack_maxsize -= size * sizeof(VALUE); - ruby_thread_set_native(th); + thread_debug("thread start: %p\n", (void *)th); { thread_debug("thread start (get lock): %p\n", (void *)th); @@ -810,11 +806,7 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) rb_fiber_close(th->ec->fiber_ptr); } - thread_cleanup_func(th, FALSE); - VM_ASSERT(th->ec->vm_stack == NULL); - VM_ASSERT(th->ec->cfp == NULL); - gvl_release(th->vm); return 0; @@ -2261,7 +2253,6 @@ rb_threadptr_execute_interrupts(rb_thread_t *th, int blocking_timing) if (th->status == THREAD_RUNNABLE) th->running_time_us += TIME_QUANTUM_USEC; - VM_ASSERT(th->ec->cfp); EXEC_EVENT_HOOK(th->ec, RUBY_INTERNAL_EVENT_SWITCH, th->ec->cfp->self, 0, 0, 0, Qundef); diff --git a/vm.c b/vm.c index 7ad6bdd264..258c1b5942 100644 --- a/vm.c +++ b/vm.c @@ -2685,36 +2685,20 @@ thread_alloc(VALUE klass) return obj; } -inline void -rb_ec_set_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size) -{ - ec->vm_stack = stack; - ec->vm_stack_size = size; -} - void rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size) { - rb_ec_set_vm_stack(ec, stack, size); - - ec->cfp = (void *)(ec->vm_stack + ec->vm_stack_size); + rb_ec_set_vm_stack(ec, stack, size); - rb_vm_push_frame(ec, - NULL /* dummy iseq */, - VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */, - Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */, - 0 /* dummy cref/me */, - 0 /* dummy pc */, ec->vm_stack, 0, 0 - ); -} - -void -rb_ec_clear_vm_stack(rb_execution_context_t *ec) -{ - rb_ec_set_vm_stack(ec, NULL, 0); + ec->cfp = (void *)(ec->vm_stack + ec->vm_stack_size); - // Avoid dangling pointers: - // ec->cfp = NULL; + rb_vm_push_frame(ec, + NULL /* dummy iseq */, + VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */, + Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */, + 0 /* dummy cref/me */, + 0 /* dummy pc */, ec->vm_stack, 0, 0 + ); } static void diff --git a/vm_core.h b/vm_core.h index d199fcdff0..99dee425ab 100644 --- a/vm_core.h +++ b/vm_core.h @@ -907,10 +907,6 @@ void rb_ec_set_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size); // @param size the size of the stack, as in `VALUE stack[size]`. void rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size); -// Clear (set to `NULL`) the vm_stack pointer and frame pointer in the execution context. -// @param ec the execution context to update. -void rb_ec_clear_vm_stack(rb_execution_context_t *ec); - typedef struct rb_thread_struct { struct list_node vmlt_node; VALUE self; -- cgit v1.2.3