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

Unified Diff: base/profiler/native_stack_sampler_win.cc

Issue 2601633002: Use a common buffer across all instances for stack-copy. (Closed)
Patch Set: rebased Created 3 years, 8 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..47c14f41470110efea91e5dfb20b9167715da1d2 100644
--- a/base/profiler/native_stack_sampler_win.cc
+++ b/base/profiler/native_stack_sampler_win.cc
@@ -18,6 +18,7 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/macros.h"
+#include "base/memory/ptr_util.h"
#include "base/profiler/win32_stack_frame_unwinder.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
@@ -386,6 +387,24 @@ void SuspendThreadAndRecordStack(
class NativeStackSamplerWin : public NativeStackSampler {
public:
+ enum {
+ // Intended to hold the largest stack used by Chrome. The default Win32
+ // reserved stack size is 1 MB and Chrome Windows threads currently always
+ // use the default, but this allows for expansion if it occurs. The size
+ // beyond the actual stack size consists of unallocated virtual memory pages
+ // so carries little cost (just a bit of wasted address space).
+ kStackCopyBufferSize = 2 * 1024 * 1024
+ };
+
+ class StackBufferWin : public StackBuffer {
+ public:
+ StackBufferWin() {}
+ ~StackBufferWin() override {}
+
+ // Buffer to use for copies of the stack.
+ unsigned char stack_copy_buffer_[kStackCopyBufferSize];
+ };
+
NativeStackSamplerWin(win::ScopedHandle thread_handle,
AnnotateCallback annotator,
NativeStackSamplerTestDelegate* test_delegate);
@@ -394,19 +413,11 @@ class NativeStackSamplerWin : public NativeStackSampler {
// StackSamplingProfiler::NativeStackSampler:
void ProfileRecordingStarting(
std::vector<StackSamplingProfiler::Module>* modules) override;
- void RecordStackSample(StackSamplingProfiler::Sample* sample) override;
- void ProfileRecordingStopped() override;
+ void RecordStackSample(StackBuffer* stackbuffer,
+ StackSamplingProfiler::Sample* sample) override;
+ void ProfileRecordingStopped(StackBuffer* stackbuffer) override;
private:
- enum {
- // Intended to hold the largest stack used by Chrome. The default Win32
- // reserved stack size is 1 MB and Chrome Windows threads currently always
- // use the default, but this allows for expansion if it occurs. The size
- // beyond the actual stack size consists of unallocated virtual memory pages
- // so carries little cost (just a bit of wasted address space).
- kStackCopyBufferSize = 2 * 1024 * 1024
- };
-
// Attempts to query the module filename, base address, and id for
// |module_handle|, and store them in |module|. Returns true if it succeeded.
static bool GetModuleForHandle(HMODULE module_handle,
@@ -433,10 +444,6 @@ class NativeStackSamplerWin : public NativeStackSampler {
// The stack base address corresponding to |thread_handle_|.
const void* const thread_stack_base_address_;
- // Buffer to use for copies of the stack. We use the same buffer for all the
- // samples to avoid the overhead of multiple allocations and frees.
- const std::unique_ptr<unsigned char[]> stack_copy_buffer_;
-
// Weak. Points to the modules associated with the profile being recorded
// between ProfileRecordingStarting() and ProfileRecordingStopped().
std::vector<StackSamplingProfiler::Module>* current_modules_;
@@ -456,8 +463,7 @@ NativeStackSamplerWin::NativeStackSamplerWin(
annotator_(annotator),
test_delegate_(test_delegate),
thread_stack_base_address_(
- GetThreadEnvironmentBlock(thread_handle_.Get())->Tib.StackBase),
- stack_copy_buffer_(new unsigned char[kStackCopyBufferSize]) {
+ GetThreadEnvironmentBlock(thread_handle_.Get())->Tib.StackBase) {
DCHECK(annotator_);
}
@@ -471,20 +477,20 @@ void NativeStackSamplerWin::ProfileRecordingStarting(
}
void NativeStackSamplerWin::RecordStackSample(
+ StackBuffer* stackbuffer,
StackSamplingProfiler::Sample* sample) {
+ DCHECK(stackbuffer);
DCHECK(current_modules_);
- if (!stack_copy_buffer_)
- return;
-
std::vector<RecordedFrame> stack;
- SuspendThreadAndRecordStack(thread_handle_.Get(), thread_stack_base_address_,
- stack_copy_buffer_.get(), kStackCopyBufferSize,
- &stack, annotator_, sample, test_delegate_);
+ SuspendThreadAndRecordStack(
+ thread_handle_.Get(), thread_stack_base_address_,
+ static_cast<StackBufferWin*>(stackbuffer)->stack_copy_buffer_,
+ kStackCopyBufferSize, &stack, annotator_, sample, test_delegate_);
CopyToSample(stack, sample, current_modules_);
}
-void NativeStackSamplerWin::ProfileRecordingStopped() {
+void NativeStackSamplerWin::ProfileRecordingStopped(StackBuffer* stackbuffer) {
current_modules_ = nullptr;
}
@@ -563,4 +569,9 @@ std::unique_ptr<NativeStackSampler> NativeStackSampler::Create(
return std::unique_ptr<NativeStackSampler>();
}
+std::unique_ptr<NativeStackSampler::StackBuffer>
+NativeStackSampler::CreateStackBuffer() {
+ return MakeUnique<NativeStackSamplerWin::StackBufferWin>();
+}
+
} // namespace base

Powered by Google App Engine
This is Rietveld 408576698