From 90609cc5d89e2462818f8d2f4de07b8c42cb18b0 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 8 Nov 2011 11:06:00 -0800 Subject: [PATCH] vm: don't pass this to safepoint constructor It's bad juju and MSVC calls us out on it. --- vm/errors.cpp | 2 +- vm/os-unix.cpp | 6 +++--- vm/os-windows.cpp | 4 ++-- vm/safepoints.cpp | 12 ++++++------ vm/safepoints.hpp | 13 +++++-------- vm/vm.cpp | 2 +- 6 files changed, 18 insertions(+), 21 deletions(-) diff --git a/vm/errors.cpp b/vm/errors.cpp index 47241c70af..5f3188abcb 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -89,7 +89,7 @@ void factor_vm::not_implemented_error() void factor_vm::memory_protection_error(cell addr) { if(code->safepoint_p(addr)) - safepoint.handle_safepoint(); + safepoint.handle_safepoint(this); else if(faulting_p) fatal_error("Double fault", 0); else if(ctx->datastack_seg->underflow_p(addr)) diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index d5b4ea90a4..6d6dc6167d 100755 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -202,7 +202,7 @@ void fep_signal_handler(int signal, siginfo_t *siginfo, void *uap) factor_vm *vm = current_vm_p(); if (vm) { - vm->safepoint.enqueue_fep(); + vm->safepoint.enqueue_fep(vm); enqueue_signal(vm, signal); } else @@ -213,10 +213,10 @@ void sample_signal_handler(int signal, siginfo_t *siginfo, void *uap) { factor_vm *vm = current_vm_p(); if (vm) - vm->safepoint.enqueue_samples(1, (cell)UAP_PROGRAM_COUNTER(uap), false); + vm->safepoint.enqueue_samples(vm, 1, (cell)UAP_PROGRAM_COUNTER(uap), false); else if (thread_vms.size() == 1) { factor_vm *the_only_vm = thread_vms.begin()->second; - the_only_vm->safepoint.enqueue_samples(1, (cell)UAP_PROGRAM_COUNTER(uap), true); + the_only_vm->safepoint.enqueue_samples(vm, 1, (cell)UAP_PROGRAM_COUNTER(uap), true); } } diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index 4b4b4e78c3..97c227e74e 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -288,7 +288,7 @@ static BOOL WINAPI ctrl_handler(DWORD dwCtrlType) threads. */ assert(thread_vms.size() == 1); factor_vm *vm = thread_vms.begin()->second; - vm->safepoint.enqueue_fep(); + vm->safepoint.enqueue_fep(this); return TRUE; } default: @@ -348,7 +348,7 @@ void factor_vm::sampler_thread_loop() suscount = ResumeThread(thread); assert(suscount == 1); - safepoint.enqueue_samples(samples, context.EIP, false); + safepoint.enqueue_samples(this, samples, context.EIP, false); } } } diff --git a/vm/safepoints.cpp b/vm/safepoints.cpp index 425b78a4fe..83621e477f 100644 --- a/vm/safepoints.cpp +++ b/vm/safepoints.cpp @@ -3,20 +3,20 @@ namespace factor { -void safepoint_state::enqueue_safepoint() volatile +void safepoint_state::enqueue_safepoint(factor_vm *parent) volatile { parent->code->guard_safepoint(); } -void safepoint_state::enqueue_fep() volatile +void safepoint_state::enqueue_fep(factor_vm *parent) volatile { if (parent->fep_p) fatal_error("Low-level debugger interrupted", 0); atomic::store(&fep_p, true); - enqueue_safepoint(); + enqueue_safepoint(parent); } -void safepoint_state::enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile +void safepoint_state::enqueue_samples(factor_vm *parent, cell samples, cell pc, bool foreign_thread_p) volatile { if (atomic::load(&parent->sampling_profiler_p)) { @@ -31,11 +31,11 @@ void safepoint_state::enqueue_samples(cell samples, cell pc, bool foreign_thread if (!parent->code->seg->in_segment_p(pc)) atomic::fetch_add(&sample_counts.foreign_sample_count, samples); } - enqueue_safepoint(); + enqueue_safepoint(parent); } } -void safepoint_state::handle_safepoint() volatile +void safepoint_state::handle_safepoint(factor_vm *parent) volatile { parent->code->unguard_safepoint(); diff --git a/vm/safepoints.hpp b/vm/safepoints.hpp index 8b559f1b9c..782de47be7 100644 --- a/vm/safepoints.hpp +++ b/vm/safepoints.hpp @@ -3,23 +3,20 @@ namespace factor struct safepoint_state { - factor_vm *parent; - cell fep_p; profiling_sample_count sample_counts; - safepoint_state(factor_vm *parent) : - parent(parent), + safepoint_state() : fep_p(false), sample_counts() { } - void handle_safepoint() volatile; + void handle_safepoint(factor_vm *parent) volatile; - void enqueue_safepoint() volatile; - void enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile; - void enqueue_fep() volatile; + void enqueue_safepoint(factor_vm *parent) volatile; + void enqueue_samples(factor_vm *parent, cell samples, cell pc, bool foreign_thread_p) volatile; + void enqueue_fep(factor_vm *parent) volatile; }; } diff --git a/vm/vm.cpp b/vm/vm.cpp index 16005a9735..d2298c289a 100755 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -24,7 +24,7 @@ factor_vm::factor_vm(THREADHANDLE thread) : last_nano_count(0), signal_callstack_seg(NULL), faulting_p(false), - safepoint(this) + safepoint() { primitive_reset_dispatch_stats(); }