OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 <cstdio> | 5 #include <cstdio> |
6 | 6 |
7 #include "platform/utils.h" | 7 #include "platform/utils.h" |
8 | 8 |
9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
10 #include "vm/json_stream.h" | 10 #include "vm/json_stream.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 | 61 |
62 // Notes on stack frame walking: | 62 // Notes on stack frame walking: |
63 // | 63 // |
64 // The sampling profiler will collect up to Sample::kNumStackFrames stack frames | 64 // The sampling profiler will collect up to Sample::kNumStackFrames stack frames |
65 // The stack frame walking code uses the frame pointer to traverse the stack. | 65 // The stack frame walking code uses the frame pointer to traverse the stack. |
66 // If the VM is compiled without frame pointers (which is the default on | 66 // If the VM is compiled without frame pointers (which is the default on |
67 // recent GCC versions with optimizing enabled) the stack walking code will | 67 // recent GCC versions with optimizing enabled) the stack walking code will |
68 // fail (sometimes leading to a crash). | 68 // fail (sometimes leading to a crash). |
69 // | 69 // |
70 | 70 |
71 | |
72 DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler"); | 71 DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler"); |
73 DEFINE_FLAG(bool, trace_profiled_isolates, false, "Trace profiled isolates."); | 72 DEFINE_FLAG(bool, trace_profiled_isolates, false, "Trace profiled isolates."); |
74 | 73 |
75 bool ProfilerManager::initialized_ = false; | 74 bool ProfilerManager::initialized_ = false; |
76 bool ProfilerManager::shutdown_ = false; | 75 bool ProfilerManager::shutdown_ = false; |
77 Monitor* ProfilerManager::monitor_ = NULL; | 76 Monitor* ProfilerManager::monitor_ = NULL; |
78 Isolate** ProfilerManager::isolates_ = NULL; | 77 Isolate** ProfilerManager::isolates_ = NULL; |
79 intptr_t ProfilerManager::isolates_capacity_ = 0; | 78 intptr_t ProfilerManager::isolates_capacity_ = 0; |
80 intptr_t ProfilerManager::isolates_size_ = 0; | 79 intptr_t ProfilerManager::isolates_size_ = 0; |
81 | 80 |
82 | 81 |
83 void ProfilerManager::InitOnce() { | 82 void ProfilerManager::InitOnce() { |
| 83 #if defined(USING_SIMULATOR) |
| 84 // Force disable of profiling on simulator. |
| 85 FLAG_profile = false; |
| 86 #endif |
84 if (!FLAG_profile) { | 87 if (!FLAG_profile) { |
85 return; | 88 return; |
86 } | 89 } |
87 NativeSymbolResolver::InitOnce(); | 90 NativeSymbolResolver::InitOnce(); |
88 ASSERT(!initialized_); | 91 ASSERT(!initialized_); |
89 monitor_ = new Monitor(); | 92 monitor_ = new Monitor(); |
90 initialized_ = true; | 93 initialized_ = true; |
91 ResizeIsolates(16); | 94 ResizeIsolates(16); |
92 Thread::Start(ThreadMain, 0); | 95 Thread::Start(ThreadMain, 0); |
93 } | 96 } |
(...skipping 22 matching lines...) Expand all Loading... |
116 void ProfilerManager::SetupIsolateForProfiling(Isolate* isolate) { | 119 void ProfilerManager::SetupIsolateForProfiling(Isolate* isolate) { |
117 if (!FLAG_profile) { | 120 if (!FLAG_profile) { |
118 return; | 121 return; |
119 } | 122 } |
120 ASSERT(isolate != NULL); | 123 ASSERT(isolate != NULL); |
121 { | 124 { |
122 ScopedSignalBlocker ssb; | 125 ScopedSignalBlocker ssb; |
123 { | 126 { |
124 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); | 127 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); |
125 SampleBuffer* sample_buffer = new SampleBuffer(); | 128 SampleBuffer* sample_buffer = new SampleBuffer(); |
| 129 ASSERT(sample_buffer != NULL); |
126 IsolateProfilerData* profiler_data = | 130 IsolateProfilerData* profiler_data = |
127 new IsolateProfilerData(isolate, sample_buffer); | 131 new IsolateProfilerData(isolate, sample_buffer); |
| 132 ASSERT(profiler_data != NULL); |
128 profiler_data->set_sample_interval_micros(1000); | 133 profiler_data->set_sample_interval_micros(1000); |
129 isolate->set_profiler_data(profiler_data); | 134 isolate->set_profiler_data(profiler_data); |
130 if (FLAG_trace_profiled_isolates) { | 135 if (FLAG_trace_profiled_isolates) { |
131 OS::Print("PROF SETUP %p %s %p\n", | 136 OS::Print("PROF SETUP %p %s %p\n", |
132 isolate, | 137 isolate, |
133 isolate->name(), | 138 isolate->name(), |
134 reinterpret_cast<void*>(Thread::GetCurrentThreadId())); | 139 reinterpret_cast<void*>(Thread::GetCurrentThreadId())); |
135 } | 140 } |
136 } | 141 } |
137 } | 142 } |
138 } | 143 } |
139 | 144 |
140 | 145 |
141 void ProfilerManager::FreeIsolateProfilingData(Isolate* isolate) { | 146 void ProfilerManager::FreeIsolateProfilingData(Isolate* isolate) { |
142 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); | 147 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); |
143 IsolateProfilerData* profiler_data = isolate->profiler_data(); | 148 IsolateProfilerData* profiler_data = isolate->profiler_data(); |
144 if (profiler_data == NULL) { | 149 if (profiler_data == NULL) { |
145 // Already freed. | 150 // Already freed. |
146 return; | 151 return; |
147 } | 152 } |
148 isolate->set_profiler_data(NULL); | 153 isolate->set_profiler_data(NULL); |
149 SampleBuffer* sample_buffer = profiler_data->sample_buffer(); | 154 SampleBuffer* sample_buffer = profiler_data->sample_buffer(); |
150 ASSERT(sample_buffer != NULL); | 155 ASSERT(sample_buffer != NULL); |
| 156 profiler_data->set_sample_buffer(NULL); |
151 delete sample_buffer; | 157 delete sample_buffer; |
152 delete profiler_data; | 158 delete profiler_data; |
153 if (FLAG_trace_profiled_isolates) { | 159 if (FLAG_trace_profiled_isolates) { |
154 OS::Print("PROF SHUTDOWN %p %s %p\n", isolate, | 160 OS::Print("PROF SHUTDOWN %p %s %p\n", isolate, |
155 isolate->name(), reinterpret_cast<void*>(Thread::GetCurrentThreadId())); | 161 isolate->name(), reinterpret_cast<void*>(Thread::GetCurrentThreadId())); |
156 } | 162 } |
157 } | 163 } |
158 | 164 |
159 | 165 |
160 void ProfilerManager::ShutdownIsolateForProfiling(Isolate* isolate) { | 166 void ProfilerManager::ShutdownIsolateForProfiling(Isolate* isolate) { |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 } | 527 } |
522 vm_tags = kIdle; | 528 vm_tags = kIdle; |
523 runtime_tags = 0; | 529 runtime_tags = 0; |
524 } | 530 } |
525 | 531 |
526 | 532 |
527 SampleBuffer::SampleBuffer(intptr_t capacity) { | 533 SampleBuffer::SampleBuffer(intptr_t capacity) { |
528 start_ = 0; | 534 start_ = 0; |
529 end_ = 0; | 535 end_ = 0; |
530 capacity_ = capacity; | 536 capacity_ = capacity; |
531 samples_ = reinterpret_cast<Sample*>(calloc(capacity, sizeof(Sample))); | 537 samples_ = new Sample[capacity]; |
532 } | 538 } |
533 | 539 |
534 | 540 |
535 SampleBuffer::~SampleBuffer() { | 541 SampleBuffer::~SampleBuffer() { |
536 if (samples_ != NULL) { | 542 if (samples_ != NULL) { |
537 free(samples_); | 543 delete[] samples_; |
538 samples_ = NULL; | 544 samples_ = NULL; |
539 } | 545 } |
540 } | 546 } |
541 | 547 |
542 | 548 |
543 Sample* SampleBuffer::ReserveSample() { | 549 Sample* SampleBuffer::ReserveSample() { |
| 550 ASSERT(samples_ != NULL); |
544 intptr_t index = end_; | 551 intptr_t index = end_; |
545 end_ = WrapIncrement(end_); | 552 end_ = WrapIncrement(end_); |
546 if (end_ == start_) { | 553 if (end_ == start_) { |
547 start_ = WrapIncrement(start_); | 554 start_ = WrapIncrement(start_); |
548 } | 555 } |
| 556 ASSERT(index >= 0); |
| 557 ASSERT(index < capacity_); |
549 // Reset. | 558 // Reset. |
550 samples_[index] = Sample(); | 559 samples_[index] = Sample(); |
551 return &samples_[index]; | 560 return &samples_[index]; |
552 } | 561 } |
553 | 562 |
554 | 563 |
555 Sample* SampleBuffer::FirstSample() const { | 564 Sample* SampleBuffer::FirstSample() const { |
556 return &samples_[start_]; | 565 return &samples_[start_]; |
557 } | 566 } |
558 | 567 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 return false; | 653 return false; |
645 } | 654 } |
646 uintptr_t cursor = reinterpret_cast<uintptr_t>(fp); | 655 uintptr_t cursor = reinterpret_cast<uintptr_t>(fp); |
647 cursor += sizeof(fp); | 656 cursor += sizeof(fp); |
648 bool r = cursor >= lower_bound_ && cursor < stack_upper_; | 657 bool r = cursor >= lower_bound_ && cursor < stack_upper_; |
649 return r; | 658 return r; |
650 } | 659 } |
651 | 660 |
652 | 661 |
653 } // namespace dart | 662 } // namespace dart |
OLD | NEW |