Index: base/profiler/stack_sampling_profiler.cc |
diff --git a/base/profiler/stack_sampling_profiler.cc b/base/profiler/stack_sampling_profiler.cc |
index 0263a9f81af95b8d605e09c685d9fd21e9489bcb..76ad81df9e87968c4c8ab7fb0316aac44037cb3d 100644 |
--- a/base/profiler/stack_sampling_profiler.cc |
+++ b/base/profiler/stack_sampling_profiler.cc |
@@ -250,6 +250,11 @@ class StackSamplingProfiler::SamplingThread : public Thread { |
// Thread: |
void CleanUp() override; |
+ // A stack-buffer used by the native sampler for its work. This buffer can |
+ // be re-used for multiple native sampler objects so long as the API calls |
+ // that take it are not called concurrently. |
+ std::unique_ptr<NativeStackSampler::StackBuffer> stack_buffer_; |
+ |
// A map of IDs to collection contexts. Because this class is a singleton |
// that is never destroyed, context objects will never be destructed except |
// by explicit action. Thus, it's acceptable to pass unretained pointers |
@@ -421,6 +426,9 @@ StackSamplingProfiler::SamplingThread::GetOrCreateTaskRunnerForAdd() { |
Stop(); |
} |
+ DCHECK(!stack_buffer_); |
+ stack_buffer_ = NativeStackSampler::CreateStackBuffer(); |
+ |
// The thread is not running. Start it and get associated runner. The task- |
// runner has to be saved for future use because though it can be used from |
// any thread, it can be acquired via task_runner() only on the created |
@@ -517,12 +525,13 @@ void StackSamplingProfiler::SamplingThread::RecordSample( |
// Record a single sample. |
profile.samples.push_back(Sample()); |
- collection->native_sampler->RecordStackSample(&profile.samples.back()); |
+ collection->native_sampler->RecordStackSample(stack_buffer_.get(), |
+ &profile.samples.back()); |
// If this is the last sample of a burst, record the total time. |
if (collection->sample == collection->params.samples_per_burst - 1) { |
profile.profile_duration = Time::Now() - collection->profile_start_time; |
- collection->native_sampler->ProfileRecordingStopped(); |
+ collection->native_sampler->ProfileRecordingStopped(stack_buffer_.get()); |
} |
} |
@@ -647,6 +656,7 @@ void StackSamplingProfiler::SamplingThread::ShutdownTask(int add_events) { |
// confusion. |
thread_execution_state_ = EXITING; |
thread_execution_state_task_runner_ = nullptr; |
+ stack_buffer_.reset(); |
} |
bool StackSamplingProfiler::SamplingThread::UpdateNextSampleTime( |