| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/profiler_service.h" | 5 #include "vm/profiler_service.h" |
| 6 | 6 |
| 7 #include "vm/growable_array.h" | 7 #include "vm/growable_array.h" |
| 8 #include "vm/native_symbol.h" | 8 #include "vm/native_symbol.h" |
| 9 #include "vm/object.h" | 9 #include "vm/object.h" |
| 10 #include "vm/os.h" | 10 #include "vm/os.h" |
| (...skipping 2176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2187 return true; | 2187 return true; |
| 2188 } | 2188 } |
| 2189 | 2189 |
| 2190 | 2190 |
| 2191 intptr_t ProfileTrieWalker::SiblingCount() { | 2191 intptr_t ProfileTrieWalker::SiblingCount() { |
| 2192 ASSERT(parent_ != NULL); | 2192 ASSERT(parent_ != NULL); |
| 2193 return parent_->NumChildren(); | 2193 return parent_->NumChildren(); |
| 2194 } | 2194 } |
| 2195 | 2195 |
| 2196 | 2196 |
| 2197 void ProfilerService::PrintJSONImpl(Isolate* isolate, | 2197 void ProfilerService::PrintJSONImpl(Thread* thread, |
| 2198 JSONStream* stream, | 2198 JSONStream* stream, |
| 2199 Profile::TagOrder tag_order, | 2199 Profile::TagOrder tag_order, |
| 2200 intptr_t extra_tags, | 2200 intptr_t extra_tags, |
| 2201 SampleFilter* filter) { | 2201 SampleFilter* filter) { |
| 2202 Isolate* isolate = thread->isolate(); |
| 2202 // Disable profile interrupts while processing the buffer. | 2203 // Disable profile interrupts while processing the buffer. |
| 2203 Profiler::EndExecution(isolate); | 2204 Profiler::EndExecution(isolate); |
| 2204 | 2205 |
| 2205 { | 2206 { |
| 2206 MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); | 2207 MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); |
| 2207 IsolateProfilerData* profiler_data = isolate->profiler_data(); | 2208 IsolateProfilerData* profiler_data = isolate->profiler_data(); |
| 2208 if (profiler_data == NULL) { | 2209 if (profiler_data == NULL) { |
| 2209 stream->PrintError(kFeatureDisabled, NULL); | 2210 stream->PrintError(kFeatureDisabled, NULL); |
| 2210 return; | 2211 return; |
| 2211 } | 2212 } |
| 2212 } | 2213 } |
| 2213 | 2214 |
| 2214 { | 2215 { |
| 2215 StackZone zone(isolate); | 2216 StackZone zone(isolate); |
| 2216 HANDLESCOPE(isolate); | 2217 HANDLESCOPE(thread); |
| 2217 Profile profile(isolate); | 2218 Profile profile(isolate); |
| 2218 profile.Build(filter, tag_order, extra_tags); | 2219 profile.Build(filter, tag_order, extra_tags); |
| 2219 profile.PrintJSON(stream); | 2220 profile.PrintJSON(stream); |
| 2220 } | 2221 } |
| 2221 | 2222 |
| 2222 // Enable profile interrupts. | 2223 // Enable profile interrupts. |
| 2223 Profiler::BeginExecution(isolate); | 2224 Profiler::BeginExecution(isolate); |
| 2224 } | 2225 } |
| 2225 | 2226 |
| 2226 | 2227 |
| 2227 class NoAllocationSampleFilter : public SampleFilter { | 2228 class NoAllocationSampleFilter : public SampleFilter { |
| 2228 public: | 2229 public: |
| 2229 explicit NoAllocationSampleFilter(Isolate* isolate) | 2230 explicit NoAllocationSampleFilter(Isolate* isolate) |
| 2230 : SampleFilter(isolate) { | 2231 : SampleFilter(isolate) { |
| 2231 } | 2232 } |
| 2232 | 2233 |
| 2233 bool FilterSample(Sample* sample) { | 2234 bool FilterSample(Sample* sample) { |
| 2234 return !sample->is_allocation_sample(); | 2235 return !sample->is_allocation_sample(); |
| 2235 } | 2236 } |
| 2236 }; | 2237 }; |
| 2237 | 2238 |
| 2238 | 2239 |
| 2239 void ProfilerService::PrintJSON(JSONStream* stream, | 2240 void ProfilerService::PrintJSON(JSONStream* stream, |
| 2240 Profile::TagOrder tag_order, | 2241 Profile::TagOrder tag_order, |
| 2241 intptr_t extra_tags) { | 2242 intptr_t extra_tags) { |
| 2242 Isolate* isolate = Isolate::Current(); | 2243 Thread* thread = Thread::Current(); |
| 2244 Isolate* isolate = thread->isolate(); |
| 2243 NoAllocationSampleFilter filter(isolate); | 2245 NoAllocationSampleFilter filter(isolate); |
| 2244 PrintJSONImpl(isolate, stream, tag_order, extra_tags, &filter); | 2246 PrintJSONImpl(thread, stream, tag_order, extra_tags, &filter); |
| 2245 } | 2247 } |
| 2246 | 2248 |
| 2247 | 2249 |
| 2248 class ClassAllocationSampleFilter : public SampleFilter { | 2250 class ClassAllocationSampleFilter : public SampleFilter { |
| 2249 public: | 2251 public: |
| 2250 ClassAllocationSampleFilter(Isolate* isolate, const Class& cls) | 2252 ClassAllocationSampleFilter(Isolate* isolate, const Class& cls) |
| 2251 : SampleFilter(isolate), | 2253 : SampleFilter(isolate), |
| 2252 cls_(Class::Handle(cls.raw())) { | 2254 cls_(Class::Handle(cls.raw())) { |
| 2253 ASSERT(!cls_.IsNull()); | 2255 ASSERT(!cls_.IsNull()); |
| 2254 } | 2256 } |
| 2255 | 2257 |
| 2256 bool FilterSample(Sample* sample) { | 2258 bool FilterSample(Sample* sample) { |
| 2257 return sample->is_allocation_sample() && | 2259 return sample->is_allocation_sample() && |
| 2258 (sample->allocation_cid() == cls_.id()); | 2260 (sample->allocation_cid() == cls_.id()); |
| 2259 } | 2261 } |
| 2260 | 2262 |
| 2261 private: | 2263 private: |
| 2262 const Class& cls_; | 2264 const Class& cls_; |
| 2263 }; | 2265 }; |
| 2264 | 2266 |
| 2265 | 2267 |
| 2266 void ProfilerService::PrintAllocationJSON(JSONStream* stream, | 2268 void ProfilerService::PrintAllocationJSON(JSONStream* stream, |
| 2267 Profile::TagOrder tag_order, | 2269 Profile::TagOrder tag_order, |
| 2268 const Class& cls) { | 2270 const Class& cls) { |
| 2269 Isolate* isolate = Isolate::Current(); | 2271 Thread* thread = Thread::Current(); |
| 2272 Isolate* isolate = thread->isolate(); |
| 2270 ClassAllocationSampleFilter filter(isolate, cls); | 2273 ClassAllocationSampleFilter filter(isolate, cls); |
| 2271 PrintJSONImpl(isolate, stream, tag_order, kNoExtraTags, &filter); | 2274 PrintJSONImpl(thread, stream, tag_order, kNoExtraTags, &filter); |
| 2272 } | 2275 } |
| 2273 | 2276 |
| 2274 | 2277 |
| 2275 void ProfilerService::ClearSamples() { | 2278 void ProfilerService::ClearSamples() { |
| 2276 Isolate* isolate = Isolate::Current(); | 2279 Isolate* isolate = Isolate::Current(); |
| 2277 | 2280 |
| 2278 // Disable profile interrupts while processing the buffer. | 2281 // Disable profile interrupts while processing the buffer. |
| 2279 Profiler::EndExecution(isolate); | 2282 Profiler::EndExecution(isolate); |
| 2280 | 2283 |
| 2281 MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); | 2284 MutexLocker profiler_data_lock(isolate->profiler_data_mutex()); |
| 2282 IsolateProfilerData* profiler_data = isolate->profiler_data(); | 2285 IsolateProfilerData* profiler_data = isolate->profiler_data(); |
| 2283 if (profiler_data == NULL) { | 2286 if (profiler_data == NULL) { |
| 2284 return; | 2287 return; |
| 2285 } | 2288 } |
| 2286 SampleBuffer* sample_buffer = profiler_data->sample_buffer(); | 2289 SampleBuffer* sample_buffer = profiler_data->sample_buffer(); |
| 2287 ASSERT(sample_buffer != NULL); | 2290 ASSERT(sample_buffer != NULL); |
| 2288 | 2291 |
| 2289 ClearProfileVisitor clear_profile(isolate); | 2292 ClearProfileVisitor clear_profile(isolate); |
| 2290 sample_buffer->VisitSamples(&clear_profile); | 2293 sample_buffer->VisitSamples(&clear_profile); |
| 2291 | 2294 |
| 2292 // Enable profile interrupts. | 2295 // Enable profile interrupts. |
| 2293 Profiler::BeginExecution(isolate); | 2296 Profiler::BeginExecution(isolate); |
| 2294 } | 2297 } |
| 2295 | 2298 |
| 2296 } // namespace dart | 2299 } // namespace dart |
| OLD | NEW |