It's bad juju and MSVC calls us out on it.
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))
factor_vm *vm = current_vm_p();
if (vm)
{
- vm->safepoint.enqueue_fep();
+ vm->safepoint.enqueue_fep(vm);
enqueue_signal(vm, signal);
}
else
{
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);
}
}
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:
suscount = ResumeThread(thread);
assert(suscount == 1);
- safepoint.enqueue_samples(samples, context.EIP, false);
+ safepoint.enqueue_samples(this, samples, context.EIP, false);
}
}
}
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))
{
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();
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;
};
}
last_nano_count(0),
signal_callstack_seg(NULL),
faulting_p(false),
- safepoint(this)
+ safepoint()
{
primitive_reset_dispatch_stats();
}