Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3999)

Unified Diff: base/profiler/native_stack_sampler_win.cc

Issue 2554123002: Support parallel captures from the StackSamplingProfiler. (Closed)
Patch Set: merged synchronized-stop CL Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/profiler/native_stack_sampler_win.cc
diff --git a/base/profiler/native_stack_sampler_win.cc b/base/profiler/native_stack_sampler_win.cc
index e1605109fe960d769523733b2a1190700b250d28..b1b5f4a38ea23b2170ca8f531602cffd32675d33 100644
--- a/base/profiler/native_stack_sampler_win.cc
+++ b/base/profiler/native_stack_sampler_win.cc
@@ -326,7 +326,7 @@ bool PointsToGuardPage(uintptr_t stack_pointer) {
// ScopedSuspendThread scope, including indirectly via use of DCHECK/CHECK or
// other logging statements. Otherwise this code can deadlock on heap locks in
// the default heap acquired by the target thread before it was suspended.
-void SuspendThreadAndRecordStack(
+NativeStackSampler::ThreadState SuspendThreadAndRecordStack(
HANDLE thread_handle,
const void* base_address,
void* stack_copy_buffer,
@@ -349,10 +349,11 @@ void SuspendThreadAndRecordStack(
ScopedSuspendThread suspend_thread(thread_handle);
if (!suspend_thread.was_successful())
- return;
+ return NativeStackSampler::THREAD_UNSUSPENDABLE;
if (!::GetThreadContext(thread_handle, &thread_context))
- return;
+ return NativeStackSampler::THREAD_NO_INFO;
+
#if defined(_WIN64)
bottom = thread_context.Rsp;
#else
@@ -360,13 +361,13 @@ void SuspendThreadAndRecordStack(
#endif
if ((top - bottom) > stack_copy_buffer_size)
- return;
+ return NativeStackSampler::THREAD_STACK_TOO_BIG;
// Dereferencing a pointer in the guard page in a thread that doesn't own
// the stack results in a STATUS_GUARD_PAGE_VIOLATION exception and a crash.
// This occurs very rarely, but reliably over the population.
if (PointsToGuardPage(bottom))
- return;
+ return NativeStackSampler::THREAD_INACCESSIBLE;
(*annotator)(sample);
@@ -380,6 +381,7 @@ void SuspendThreadAndRecordStack(
RewritePointersToStackMemory(top, bottom, &thread_context, stack_copy_buffer);
RecordStack(&thread_context, stack);
+ return NativeStackSampler::THREAD_RUNNING;
}
// NativeStackSamplerWin ------------------------------------------------------
@@ -477,11 +479,18 @@ void NativeStackSamplerWin::RecordStackSample(
if (!stack_copy_buffer_)
return;
+ if (thread_state() == THREAD_EXITED)
+ return;
+
std::vector<RecordedFrame> stack;
- SuspendThreadAndRecordStack(thread_handle_.Get(), thread_stack_base_address_,
- stack_copy_buffer_.get(), kStackCopyBufferSize,
- &stack, annotator_, sample, test_delegate_);
+ set_thread_state(SuspendThreadAndRecordStack(
+ thread_handle_.Get(), thread_stack_base_address_,
+ stack_copy_buffer_.get(), kStackCopyBufferSize, &stack, annotator_,
+ sample, test_delegate_));
CopyToSample(stack, sample, current_modules_);
+
+ if (test_delegate_)
+ test_delegate_->OnPostRecordSample(thread_state());
}
void NativeStackSamplerWin::ProfileRecordingStopped() {

Powered by Google App Engine
This is Rietveld 408576698