Index: src/platform-win32.cc |
diff --git a/src/platform-win32.cc b/src/platform-win32.cc |
index 48f306d4eab37970bae6ceef1083a6977de3a879..2666cc04bc4e2f1159c313f179884ac712142811 100644 |
--- a/src/platform-win32.cc |
+++ b/src/platform-win32.cc |
@@ -1803,37 +1803,47 @@ class Sampler::PlatformData : public Malloced { |
// Context used for sampling the register state of the profiled thread. |
CONTEXT context; |
memset(&context, 0, sizeof(context)); |
- // Loop until the sampler is disengaged. |
- while (sampler_->IsActive()) { |
- TickSample sample; |
+ // Loop until the sampler is disengaged, keeping the specified samling freq. |
+ for ( ; sampler_->IsActive(); Sleep(sampler_->interval_)) { |
+#ifdef ENABLE_CPP_PROFILES_PROCESSOR |
+ if (Logger::state() == GC) continue; |
+ |
+ TickSample* sample = NULL; |
+#else |
+ TickSample sample_obj, *sample = &sample_obj; |
// We always sample the VM state. |
- sample.state = Logger::state(); |
+ sample->state = Logger::state(); |
+#endif // ENABLE_CPP_PROFILES_PROCESSOR |
// If profiling, we record the pc and sp of the profiled thread. |
if (sampler_->IsProfiling() |
&& SuspendThread(profiled_thread_) != (DWORD)-1) { |
context.ContextFlags = CONTEXT_FULL; |
if (GetThreadContext(profiled_thread_, &context) != 0) { |
+#ifdef ENABLE_CPP_PROFILES_PROCESSOR |
+ sample = CpuProfiler::TickSampleEvent(); |
+#endif |
+ if (sample != NULL) { |
#if V8_HOST_ARCH_X64 |
- sample.pc = reinterpret_cast<Address>(context.Rip); |
- sample.sp = reinterpret_cast<Address>(context.Rsp); |
- sample.fp = reinterpret_cast<Address>(context.Rbp); |
+ sample->pc = reinterpret_cast<Address>(context.Rip); |
+ sample->sp = reinterpret_cast<Address>(context.Rsp); |
+ sample->fp = reinterpret_cast<Address>(context.Rbp); |
#else |
- sample.pc = reinterpret_cast<Address>(context.Eip); |
- sample.sp = reinterpret_cast<Address>(context.Esp); |
- sample.fp = reinterpret_cast<Address>(context.Ebp); |
+ sample->pc = reinterpret_cast<Address>(context.Eip); |
+ sample->sp = reinterpret_cast<Address>(context.Esp); |
+ sample->fp = reinterpret_cast<Address>(context.Ebp); |
#endif |
- sampler_->SampleStack(&sample); |
+ sampler_->SampleStack(sample); |
+ } |
} |
ResumeThread(profiled_thread_); |
} |
+#ifndef ENABLE_CPP_PROFILES_PROCESSOR |
// Invoke tick handler with program counter and stack pointer. |
- sampler_->Tick(&sample); |
- |
- // Wait until next sampling. |
- Sleep(sampler_->interval_); |
+ sampler_->Tick(sample); |
+#endif |
} |
} |
}; |