Index: runtime/vm/profiler_service.cc |
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc |
index d59108ba3d42efafbd79e80c9c0d15c7abaa3d7f..38118a60c8e405b2e025fa18f3f2e947338bb066 100644 |
--- a/runtime/vm/profiler_service.cc |
+++ b/runtime/vm/profiler_service.cc |
@@ -1051,7 +1051,13 @@ class ProfileBuilder : public ValueObject { |
void FilterSamples() { |
ScopeTimer sw("ProfileBuilder::FilterSamples", FLAG_trace_profiler); |
- SampleBuffer* sample_buffer = Profiler::sample_buffer(); |
+ Isolate* isolate = thread_->isolate(); |
+ MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); |
+ IsolateProfilerData* profiler_data = isolate->profiler_data(); |
+ if (profiler_data == NULL) { |
+ return; |
+ } |
+ SampleBuffer* sample_buffer = profiler_data->sample_buffer(); |
if (sample_buffer == NULL) { |
return; |
} |
@@ -2213,13 +2219,16 @@ void ProfilerService::PrintJSONImpl(Thread* thread, |
intptr_t extra_tags, |
SampleFilter* filter) { |
Isolate* isolate = thread->isolate(); |
- // Disable thread interrupts while processing the buffer. |
- DisableThreadInterruptsScope dtis(thread); |
+ // Disable profile interrupts while processing the buffer. |
+ Profiler::EndExecution(isolate); |
- SampleBuffer* sample_buffer = Profiler::sample_buffer(); |
- if (sample_buffer == NULL) { |
- stream->PrintError(kFeatureDisabled, NULL); |
- return; |
+ { |
+ MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); |
+ IsolateProfilerData* profiler_data = isolate->profiler_data(); |
+ if (profiler_data == NULL) { |
+ stream->PrintError(kFeatureDisabled, NULL); |
+ return; |
+ } |
} |
{ |
@@ -2229,6 +2238,9 @@ void ProfilerService::PrintJSONImpl(Thread* thread, |
profile.Build(thread, filter, tag_order, extra_tags); |
profile.PrintJSON(stream); |
} |
+ |
+ // Enable profile interrupts. |
+ Profiler::BeginExecution(isolate); |
} |
@@ -2283,19 +2295,24 @@ void ProfilerService::PrintAllocationJSON(JSONStream* stream, |
void ProfilerService::ClearSamples() { |
- SampleBuffer* sample_buffer = Profiler::sample_buffer(); |
- if (sample_buffer == NULL) { |
- return; |
- } |
+ Isolate* isolate = Isolate::Current(); |
- Thread* thread = Thread::Current(); |
- Isolate* isolate = thread->isolate(); |
+ // Disable profile interrupts while processing the buffer. |
+ Profiler::EndExecution(isolate); |
- // Disable thread interrupts while processing the buffer. |
- DisableThreadInterruptsScope dtis(thread); |
+ MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); |
+ IsolateProfilerData* profiler_data = isolate->profiler_data(); |
+ if (profiler_data == NULL) { |
+ return; |
+ } |
+ SampleBuffer* sample_buffer = profiler_data->sample_buffer(); |
+ ASSERT(sample_buffer != NULL); |
ClearProfileVisitor clear_profile(isolate); |
sample_buffer->VisitSamples(&clear_profile); |
+ |
+ // Enable profile interrupts. |
+ Profiler::BeginExecution(isolate); |
} |
} // namespace dart |