diff --git a/vm/debug.cpp b/vm/debug.cpp index 6787bdc725..178b9b9381 100755 --- a/vm/debug.cpp +++ b/vm/debug.cpp @@ -390,6 +390,9 @@ void factor_vm::factorbug() exit(1); } + if (sampling_profiler_p) + end_sampling_profiler(); + fep_p = true; std::cout << "Starting low level debugger..." << std::endl; diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index 389732ed9c..2ab696715c 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -312,7 +312,7 @@ void factor_vm::sampler_thread_loop() assert(QueryPerformanceCounter(&counter)); while (FACTOR_MEMORY_BARRIER(), sampling_profiler_p) { - Sleep(0); + SwitchToThread(); assert(QueryPerformanceCounter(&new_counter)); cell samples = 0; while (new_counter.QuadPart - counter.QuadPart > units_per_sample) { @@ -320,7 +320,8 @@ void factor_vm::sampler_thread_loop() ++samples; counter.QuadPart += units_per_sample; } - enqueue_safepoint_sample(samples, 0, false); + if (samples > 0) + enqueue_safepoint_sample(samples, 0, false); } } @@ -344,6 +345,8 @@ void factor_vm::start_sampling_profiler_timer() void factor_vm::end_sampling_profiler_timer() { + sampling_profiler_p = false; + FACTOR_MEMORY_BARRIER(); DWORD wait_result = WaitForSingleObject(sampler_thread, 3000/FACTOR_PROFILE_SAMPLES_PER_SECOND); if (wait_result != WAIT_OBJECT_0) diff --git a/vm/sampling_profiler.cpp b/vm/sampling_profiler.cpp index cacc9ab6f9..9a7a4685b4 100644 --- a/vm/sampling_profiler.cpp +++ b/vm/sampling_profiler.cpp @@ -92,6 +92,8 @@ void factor_vm::start_sampling_profiler() { safepoint_sample_count = 0; safepoint_gc_sample_count = 0; + safepoint_foreign_sample_count = 0; + safepoint_foreign_thread_sample_count = 0; clear_samples(); samples.reserve(10*FACTOR_PROFILE_SAMPLES_PER_SECOND); sample_callstacks.reserve(100*FACTOR_PROFILE_SAMPLES_PER_SECOND); diff --git a/vm/vm.cpp b/vm/vm.cpp index 47669f615a..bdb5158a15 100755 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -12,6 +12,8 @@ factor_vm::factor_vm() : safepoint_fep(false), safepoint_sample_count(0), safepoint_gc_sample_count(0), + safepoint_foreign_sample_count(0), + safepoint_foreign_thread_sample_count(0), gc_off(false), current_gc(NULL), gc_events(NULL),