| 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler"); | 71 DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler"); |
| 72 DEFINE_FLAG(bool, trace_profiled_isolates, false, "Trace profiled isolates."); | 72 DEFINE_FLAG(bool, trace_profiled_isolates, false, "Trace profiled isolates."); |
| 73 | 73 |
| 74 bool ProfilerManager::initialized_ = false; | 74 bool ProfilerManager::initialized_ = false; |
| 75 bool ProfilerManager::shutdown_ = false; | 75 bool ProfilerManager::shutdown_ = false; |
| 76 bool ProfilerManager::thread_running_ = false; |
| 76 Monitor* ProfilerManager::monitor_ = NULL; | 77 Monitor* ProfilerManager::monitor_ = NULL; |
| 78 Monitor* ProfilerManager::start_stop_monitor_ = NULL; |
| 77 Isolate** ProfilerManager::isolates_ = NULL; | 79 Isolate** ProfilerManager::isolates_ = NULL; |
| 78 intptr_t ProfilerManager::isolates_capacity_ = 0; | 80 intptr_t ProfilerManager::isolates_capacity_ = 0; |
| 79 intptr_t ProfilerManager::isolates_size_ = 0; | 81 intptr_t ProfilerManager::isolates_size_ = 0; |
| 80 | 82 |
| 81 | 83 |
| 82 void ProfilerManager::InitOnce() { | 84 void ProfilerManager::InitOnce() { |
| 83 #if defined(USING_SIMULATOR) | 85 #if defined(USING_SIMULATOR) |
| 84 // Force disable of profiling on simulator. | 86 // Force disable of profiling on simulator. |
| 85 FLAG_profile = false; | 87 FLAG_profile = false; |
| 86 #endif | 88 #endif |
| 87 if (!FLAG_profile) { | 89 if (!FLAG_profile) { |
| 88 return; | 90 return; |
| 89 } | 91 } |
| 90 NativeSymbolResolver::InitOnce(); | 92 NativeSymbolResolver::InitOnce(); |
| 91 ASSERT(!initialized_); | 93 ASSERT(!initialized_); |
| 92 monitor_ = new Monitor(); | 94 monitor_ = new Monitor(); |
| 95 start_stop_monitor_ = new Monitor(); |
| 93 initialized_ = true; | 96 initialized_ = true; |
| 94 ResizeIsolates(16); | 97 ResizeIsolates(16); |
| 95 Thread::Start(ThreadMain, 0); | 98 if (FLAG_trace_profiled_isolates) { |
| 99 OS::Print("ProfilerManager starting up.\n"); |
| 100 } |
| 101 { |
| 102 ScopedMonitor startup_lock(start_stop_monitor_); |
| 103 Thread::Start(ThreadMain, 0); |
| 104 while (!thread_running_) { |
| 105 // Wait until profiler thread has started up. |
| 106 startup_lock.Wait(); |
| 107 } |
| 108 } |
| 109 if (FLAG_trace_profiled_isolates) { |
| 110 OS::Print("ProfilerManager running.\n"); |
| 111 } |
| 96 } | 112 } |
| 97 | 113 |
| 98 | 114 |
| 99 void ProfilerManager::Shutdown() { | 115 void ProfilerManager::Shutdown() { |
| 100 if (!FLAG_profile) { | 116 if (!FLAG_profile) { |
| 101 return; | 117 return; |
| 102 } | 118 } |
| 103 ASSERT(initialized_); | 119 ASSERT(initialized_); |
| 120 if (FLAG_trace_profiled_isolates) { |
| 121 OS::Print("ProfilerManager shutting down.\n"); |
| 122 } |
| 123 intptr_t size_at_shutdown = 0; |
| 104 { | 124 { |
| 105 ScopedSignalBlocker ssb; | 125 ScopedSignalBlocker ssb; |
| 106 { | 126 { |
| 107 ScopedMonitor lock(monitor_); | 127 ScopedMonitor lock(monitor_); |
| 108 shutdown_ = true; | 128 shutdown_ = true; |
| 129 size_at_shutdown = isolates_size_; |
| 109 isolates_size_ = 0; | 130 isolates_size_ = 0; |
| 110 free(isolates_); | 131 free(isolates_); |
| 111 isolates_ = NULL; | 132 isolates_ = NULL; |
| 112 lock.Notify(); | 133 lock.Notify(); |
| 113 } | 134 } |
| 114 } | 135 } |
| 115 NativeSymbolResolver::ShutdownOnce(); | 136 NativeSymbolResolver::ShutdownOnce(); |
| 137 { |
| 138 ScopedMonitor shutdown_lock(start_stop_monitor_); |
| 139 while (thread_running_) { |
| 140 // Wait until profiler thread has exited. |
| 141 shutdown_lock.Wait(); |
| 142 } |
| 143 } |
| 144 initialized_ = false; |
| 145 if (FLAG_trace_profiled_isolates) { |
| 146 OS::Print("ProfilerManager shut down (%" Pd ").\n", size_at_shutdown); |
| 147 } |
| 116 } | 148 } |
| 117 | 149 |
| 118 | 150 |
| 119 void ProfilerManager::SetupIsolateForProfiling(Isolate* isolate) { | 151 void ProfilerManager::SetupIsolateForProfiling(Isolate* isolate) { |
| 120 if (!FLAG_profile) { | 152 if (!FLAG_profile) { |
| 121 return; | 153 return; |
| 122 } | 154 } |
| 123 ASSERT(isolate != NULL); | 155 ASSERT(isolate != NULL); |
| 124 { | 156 { |
| 125 ScopedSignalBlocker ssb; | 157 ScopedSignalBlocker ssb; |
| 126 { | 158 { |
| 127 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); | 159 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); |
| 128 SampleBuffer* sample_buffer = new SampleBuffer(); | 160 SampleBuffer* sample_buffer = new SampleBuffer(); |
| 129 ASSERT(sample_buffer != NULL); | 161 ASSERT(sample_buffer != NULL); |
| 130 IsolateProfilerData* profiler_data = | 162 IsolateProfilerData* profiler_data = |
| 131 new IsolateProfilerData(isolate, sample_buffer); | 163 new IsolateProfilerData(isolate, sample_buffer); |
| 132 ASSERT(profiler_data != NULL); | 164 ASSERT(profiler_data != NULL); |
| 133 profiler_data->set_sample_interval_micros(1000); | 165 profiler_data->set_sample_interval_micros(1000); |
| 134 isolate->set_profiler_data(profiler_data); | 166 isolate->set_profiler_data(profiler_data); |
| 135 if (FLAG_trace_profiled_isolates) { | 167 if (FLAG_trace_profiled_isolates) { |
| 136 OS::Print("PROF SETUP %p %s %p\n", | 168 OS::Print("ProfilerManager Setup Isolate %p %s %p\n", |
| 137 isolate, | 169 isolate, |
| 138 isolate->name(), | 170 isolate->name(), |
| 139 reinterpret_cast<void*>(Thread::GetCurrentThreadId())); | 171 reinterpret_cast<void*>(Thread::GetCurrentThreadId())); |
| 140 } | 172 } |
| 141 } | 173 } |
| 142 } | 174 } |
| 143 } | 175 } |
| 144 | 176 |
| 145 | 177 |
| 146 void ProfilerManager::FreeIsolateProfilingData(Isolate* isolate) { | 178 void ProfilerManager::FreeIsolateProfilingData(Isolate* isolate) { |
| 147 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); | 179 ScopedMutex profiler_data_lock(isolate->profiler_data_mutex()); |
| 148 IsolateProfilerData* profiler_data = isolate->profiler_data(); | 180 IsolateProfilerData* profiler_data = isolate->profiler_data(); |
| 149 if (profiler_data == NULL) { | 181 if (profiler_data == NULL) { |
| 150 // Already freed. | 182 // Already freed. |
| 151 return; | 183 return; |
| 152 } | 184 } |
| 153 isolate->set_profiler_data(NULL); | 185 isolate->set_profiler_data(NULL); |
| 154 SampleBuffer* sample_buffer = profiler_data->sample_buffer(); | 186 SampleBuffer* sample_buffer = profiler_data->sample_buffer(); |
| 155 ASSERT(sample_buffer != NULL); | 187 ASSERT(sample_buffer != NULL); |
| 156 profiler_data->set_sample_buffer(NULL); | 188 profiler_data->set_sample_buffer(NULL); |
| 157 delete sample_buffer; | 189 delete sample_buffer; |
| 158 delete profiler_data; | 190 delete profiler_data; |
| 159 if (FLAG_trace_profiled_isolates) { | 191 if (FLAG_trace_profiled_isolates) { |
| 160 OS::Print("PROF SHUTDOWN %p %s %p\n", isolate, | 192 OS::Print("ProfilerManager Shutdown Isolate %p %s %p\n", |
| 161 isolate->name(), reinterpret_cast<void*>(Thread::GetCurrentThreadId())); | 193 isolate, |
| 194 isolate->name(), |
| 195 reinterpret_cast<void*>(Thread::GetCurrentThreadId())); |
| 162 } | 196 } |
| 163 } | 197 } |
| 164 | 198 |
| 165 | 199 |
| 166 void ProfilerManager::ShutdownIsolateForProfiling(Isolate* isolate) { | 200 void ProfilerManager::ShutdownIsolateForProfiling(Isolate* isolate) { |
| 167 ASSERT(isolate != NULL); | 201 ASSERT(isolate != NULL); |
| 168 if (!FLAG_profile) { | 202 if (!FLAG_profile) { |
| 169 return; | 203 return; |
| 170 } | 204 } |
| 171 { | 205 { |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 return false; | 687 return false; |
| 654 } | 688 } |
| 655 uintptr_t cursor = reinterpret_cast<uintptr_t>(fp); | 689 uintptr_t cursor = reinterpret_cast<uintptr_t>(fp); |
| 656 cursor += sizeof(fp); | 690 cursor += sizeof(fp); |
| 657 bool r = cursor >= lower_bound_ && cursor < stack_upper_; | 691 bool r = cursor >= lower_bound_ && cursor < stack_upper_; |
| 658 return r; | 692 return r; |
| 659 } | 693 } |
| 660 | 694 |
| 661 | 695 |
| 662 } // namespace dart | 696 } // namespace dart |
| OLD | NEW |