From 2d87b68a56f7203121dc67dc0f6ca630e660666c Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Wed, 2 Nov 2011 21:18:31 -0700 Subject: [PATCH] vm: sample pc on windows --- vm/factor.cpp | 5 +++-- vm/os-windows.cpp | 21 ++++++++++++++++++--- vm/sampling_profiler.cpp | 2 +- vm/vm.cpp | 3 ++- vm/vm.hpp | 5 ++++- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/vm/factor.cpp b/vm/factor.cpp index 8b777f87b5..1476d9fb36 100755 --- a/vm/factor.cpp +++ b/vm/factor.cpp @@ -212,9 +212,10 @@ void factor_vm::start_standalone_factor(int argc, vm_char **argv) 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); - thread_vms[thread_id()] = newvm; + thread_vms[thread] = newvm; return newvm; } diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index 84158cd597..e08b32b0a8 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -320,13 +320,28 @@ void factor_vm::sampler_thread_loop() assert(ok); new_counter.QuadPart *= samples_per_second; cell samples = 0; - while (new_counter.QuadPart - counter.QuadPart > units_per_second.QuadPart) { - // We would have to suspend the thread to sample the PC + while (new_counter.QuadPart - counter.QuadPart > units_per_second.QuadPart) + { ++samples; counter.QuadPart += units_per_second.QuadPart; } + 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); + } } } diff --git a/vm/sampling_profiler.cpp b/vm/sampling_profiler.cpp index 8ffbc27557..562fcdf8aa 100644 --- a/vm/sampling_profiler.cpp +++ b/vm/sampling_profiler.cpp @@ -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); if (atomic::load(¤t_jit_count) > 0) 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); } code->guard_safepoint(); diff --git a/vm/vm.cpp b/vm/vm.cpp index c17fb8c4ef..399fca9864 100755 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -3,8 +3,9 @@ namespace factor { -factor_vm::factor_vm() : +factor_vm::factor_vm(THREADHANDLE thread) : nursery(0,0), + thread(thread), callback_id(0), c_to_factor_func(NULL), counting_profiler_p(false), diff --git a/vm/vm.hpp b/vm/vm.hpp index dddb3ea8c1..9004364b37 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -36,6 +36,9 @@ struct factor_vm // ^^^^^^ // + /* Handle to the main thread we run in */ + THREADHANDLE thread; + /* Data stack and retain stack sizes */ 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); #endif - factor_vm(); + factor_vm(THREADHANDLE thread_id); ~factor_vm(); };