summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2019-06-20 15:30:29 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2019-06-20 15:30:29 +1200
commitc26c51449461e3c8ee9bb4e1800933fb3d3caf67 (patch)
treeec9566fe256fc77cbaf4d1cf685fccafb8fadd0a
parent7d9d1ed463323fe28f24d0b94212c2cb7ad109bd (diff)
Revert failed attempt at fixing invalid usage of vm_stack.
-rw-r--r--cont.c11
-rw-r--r--thread.c17
-rw-r--r--vm.c34
-rw-r--r--vm_core.h4
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;