vm: sample pc on windows
parent
1833beea52
commit
2d87b68a56
|
@ -212,9 +212,10 @@ void factor_vm::start_standalone_factor(int argc, vm_char **argv)
|
||||||
|
|
||||||
factor_vm *new_factor_vm()
|
factor_vm *new_factor_vm()
|
||||||
{
|
{
|
||||||
factor_vm *newvm = new factor_vm();
|
THREADHANDLE thread = thread_id();
|
||||||
|
factor_vm *newvm = new factor_vm(thread);
|
||||||
register_vm_with_thread(newvm);
|
register_vm_with_thread(newvm);
|
||||||
thread_vms[thread_id()] = newvm;
|
thread_vms[thread] = newvm;
|
||||||
|
|
||||||
return newvm;
|
return newvm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,13 +320,28 @@ void factor_vm::sampler_thread_loop()
|
||||||
assert(ok);
|
assert(ok);
|
||||||
new_counter.QuadPart *= samples_per_second;
|
new_counter.QuadPart *= samples_per_second;
|
||||||
cell samples = 0;
|
cell samples = 0;
|
||||||
while (new_counter.QuadPart - counter.QuadPart > units_per_second.QuadPart) {
|
while (new_counter.QuadPart - counter.QuadPart > units_per_second.QuadPart)
|
||||||
// We would have to suspend the thread to sample the PC
|
{
|
||||||
++samples;
|
++samples;
|
||||||
counter.QuadPart += units_per_second.QuadPart;
|
counter.QuadPart += units_per_second.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (samples > 0)
|
if (samples > 0)
|
||||||
enqueue_safepoint_sample(samples, 0, false);
|
{
|
||||||
|
DWORD suscount = SuspendThread(thread);
|
||||||
|
assert(suscount == 0);
|
||||||
|
|
||||||
|
CONTEXT context;
|
||||||
|
memset((void*)&context, 0, sizeof(CONTEXT));
|
||||||
|
context.ContextFlags = CONTEXT_CONTROL;
|
||||||
|
BOOL context_ok = GetThreadContext(thread, &context);
|
||||||
|
assert(context_ok);
|
||||||
|
|
||||||
|
suscount = ResumeThread(thread);
|
||||||
|
assert(suscount == 1);
|
||||||
|
|
||||||
|
enqueue_safepoint_sample(samples, context.EIP, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ void factor_vm::enqueue_safepoint_sample(cell samples, cell pc, bool foreign_thr
|
||||||
atomic::add(&safepoint_sample_counts.gc_sample_count, samples);
|
atomic::add(&safepoint_sample_counts.gc_sample_count, samples);
|
||||||
if (atomic::load(¤t_jit_count) > 0)
|
if (atomic::load(¤t_jit_count) > 0)
|
||||||
atomic::add(&safepoint_sample_counts.jit_sample_count, samples);
|
atomic::add(&safepoint_sample_counts.jit_sample_count, samples);
|
||||||
if (pc != 0 && !code->seg->in_segment_p(pc))
|
if (!code->seg->in_segment_p(pc))
|
||||||
atomic::add(&safepoint_sample_counts.foreign_sample_count, samples);
|
atomic::add(&safepoint_sample_counts.foreign_sample_count, samples);
|
||||||
}
|
}
|
||||||
code->guard_safepoint();
|
code->guard_safepoint();
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
namespace factor
|
namespace factor
|
||||||
{
|
{
|
||||||
|
|
||||||
factor_vm::factor_vm() :
|
factor_vm::factor_vm(THREADHANDLE thread) :
|
||||||
nursery(0,0),
|
nursery(0,0),
|
||||||
|
thread(thread),
|
||||||
callback_id(0),
|
callback_id(0),
|
||||||
c_to_factor_func(NULL),
|
c_to_factor_func(NULL),
|
||||||
counting_profiler_p(false),
|
counting_profiler_p(false),
|
||||||
|
|
|
@ -36,6 +36,9 @@ struct factor_vm
|
||||||
// ^^^^^^
|
// ^^^^^^
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/* Handle to the main thread we run in */
|
||||||
|
THREADHANDLE thread;
|
||||||
|
|
||||||
/* Data stack and retain stack sizes */
|
/* Data stack and retain stack sizes */
|
||||||
cell datastack_size, retainstack_size, callstack_size;
|
cell datastack_size, retainstack_size, callstack_size;
|
||||||
|
|
||||||
|
@ -754,7 +757,7 @@ struct factor_vm
|
||||||
void call_fault_handler(exception_type_t exception, exception_data_type_t code, MACH_EXC_STATE_TYPE *exc_state, MACH_THREAD_STATE_TYPE *thread_state, MACH_FLOAT_STATE_TYPE *float_state);
|
void call_fault_handler(exception_type_t exception, exception_data_type_t code, MACH_EXC_STATE_TYPE *exc_state, MACH_THREAD_STATE_TYPE *thread_state, MACH_FLOAT_STATE_TYPE *float_state);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
factor_vm();
|
factor_vm(THREADHANDLE thread_id);
|
||||||
~factor_vm();
|
~factor_vm();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue