OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_PROFILER_CPU_PROFILER_H_ | 5 #ifndef V8_PROFILER_CPU_PROFILER_H_ |
6 #define V8_PROFILER_CPU_PROFILER_H_ | 6 #define V8_PROFILER_CPU_PROFILER_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/base/atomic-utils.h" | 9 #include "src/base/atomic-utils.h" |
10 #include "src/base/atomicops.h" | 10 #include "src/base/atomicops.h" |
11 #include "src/base/platform/time.h" | 11 #include "src/base/platform/time.h" |
12 #include "src/compiler.h" | 12 #include "src/compiler.h" |
| 13 #include "src/isolate.h" |
13 #include "src/libsampler/v8-sampler.h" | 14 #include "src/libsampler/v8-sampler.h" |
14 #include "src/locked-queue.h" | 15 #include "src/locked-queue.h" |
15 #include "src/profiler/circular-queue.h" | 16 #include "src/profiler/circular-queue.h" |
16 #include "src/profiler/tick-sample.h" | 17 #include "src/profiler/tick-sample.h" |
17 | 18 |
18 namespace v8 { | 19 namespace v8 { |
19 namespace internal { | 20 namespace internal { |
20 | 21 |
21 // Forward declarations. | 22 // Forward declarations. |
22 class CodeEntry; | 23 class CodeEntry; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 static const size_t kTickSampleBufferSize = 1 * MB; | 174 static const size_t kTickSampleBufferSize = 1 * MB; |
174 static const size_t kTickSampleQueueLength = | 175 static const size_t kTickSampleQueueLength = |
175 kTickSampleBufferSize / sizeof(TickSampleEventRecord); | 176 kTickSampleBufferSize / sizeof(TickSampleEventRecord); |
176 SamplingCircularQueue<TickSampleEventRecord, | 177 SamplingCircularQueue<TickSampleEventRecord, |
177 kTickSampleQueueLength> ticks_buffer_; | 178 kTickSampleQueueLength> ticks_buffer_; |
178 LockedQueue<TickSampleEventRecord> ticks_from_vm_buffer_; | 179 LockedQueue<TickSampleEventRecord> ticks_from_vm_buffer_; |
179 base::AtomicNumber<unsigned> last_code_event_id_; | 180 base::AtomicNumber<unsigned> last_code_event_id_; |
180 unsigned last_processed_code_event_id_; | 181 unsigned last_processed_code_event_id_; |
181 }; | 182 }; |
182 | 183 |
183 #define PROFILE(IsolateGetter, Call) \ | |
184 do { \ | |
185 Isolate* the_isolate = (IsolateGetter); \ | |
186 v8::internal::Logger* logger = the_isolate->logger(); \ | |
187 if (logger->is_logging_code_events() || the_isolate->is_profiling()) { \ | |
188 logger->Call; \ | |
189 } \ | |
190 } while (false) | |
191 | |
192 class CpuProfiler : public CodeEventListener { | 184 class CpuProfiler : public CodeEventListener { |
193 public: | 185 public: |
194 explicit CpuProfiler(Isolate* isolate); | 186 explicit CpuProfiler(Isolate* isolate); |
195 | 187 |
196 CpuProfiler(Isolate* isolate, | 188 CpuProfiler(Isolate* isolate, |
197 CpuProfilesCollection* test_collection, | 189 CpuProfilesCollection* test_collection, |
198 ProfileGenerator* test_generator, | 190 ProfileGenerator* test_generator, |
199 ProfilerEventsProcessor* test_processor); | 191 ProfilerEventsProcessor* test_processor); |
200 | 192 |
201 ~CpuProfiler() override; | 193 ~CpuProfiler() override; |
202 | 194 |
203 void set_sampling_interval(base::TimeDelta value); | 195 void set_sampling_interval(base::TimeDelta value); |
204 void CollectSample(); | 196 void CollectSample(); |
205 void StartProfiling(const char* title, bool record_samples = false); | 197 void StartProfiling(const char* title, bool record_samples = false); |
206 void StartProfiling(String* title, bool record_samples); | 198 void StartProfiling(String* title, bool record_samples); |
207 CpuProfile* StopProfiling(const char* title); | 199 CpuProfile* StopProfiling(const char* title); |
208 CpuProfile* StopProfiling(String* title); | 200 CpuProfile* StopProfiling(String* title); |
209 int GetProfilesCount(); | 201 int GetProfilesCount(); |
210 CpuProfile* GetProfile(int index); | 202 CpuProfile* GetProfile(int index); |
211 void DeleteAllProfiles(); | 203 void DeleteAllProfiles(); |
212 void DeleteProfile(CpuProfile* profile); | 204 void DeleteProfile(CpuProfile* profile); |
213 | 205 |
214 // Invoked from stack sampler (thread or signal handler.) | 206 // Invoked from stack sampler (thread or signal handler.) |
215 inline TickSample* StartTickSample(); | 207 inline TickSample* StartTickSample(); |
216 inline void FinishTickSample(); | 208 inline void FinishTickSample(); |
217 | 209 |
218 // Must be called via PROFILE macro, otherwise will crash when | 210 // Must be called via PROFILE macro, otherwise will crash when |
219 // profiling is not enabled. | 211 // profiling is not enabled. |
220 void CallbackEvent(Name* name, Address entry_point) override; | 212 void CallbackEvent(Name* name, Address entry_point) override; |
221 void CodeCreateEvent(Logger::LogEventsAndTags tag, AbstractCode* code, | 213 void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
222 const char* comment) override; | 214 const char* comment) override; |
223 void CodeCreateEvent(Logger::LogEventsAndTags tag, AbstractCode* code, | 215 void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
224 Name* name) override; | 216 Name* name) override; |
225 void CodeCreateEvent(Logger::LogEventsAndTags tag, AbstractCode* code, | 217 void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
226 SharedFunctionInfo* shared, Name* script_name) override; | 218 SharedFunctionInfo* shared, Name* script_name) override; |
227 void CodeCreateEvent(Logger::LogEventsAndTags tag, AbstractCode* code, | 219 void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
228 SharedFunctionInfo* shared, Name* script_name, int line, | 220 SharedFunctionInfo* shared, Name* script_name, int line, |
229 int column) override; | 221 int column) override; |
230 void CodeCreateEvent(Logger::LogEventsAndTags tag, AbstractCode* code, | 222 void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
231 int args_count) override; | 223 int args_count) override; |
232 void CodeMovingGCEvent() override {} | 224 void CodeMovingGCEvent() override {} |
233 void CodeMoveEvent(AbstractCode* from, Address to) override; | 225 void CodeMoveEvent(AbstractCode* from, Address to) override; |
234 void CodeDisableOptEvent(AbstractCode* code, | 226 void CodeDisableOptEvent(AbstractCode* code, |
235 SharedFunctionInfo* shared) override; | 227 SharedFunctionInfo* shared) override; |
236 void CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta); | 228 void CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta) override; |
237 void GetterCallbackEvent(Name* name, Address entry_point) override; | 229 void GetterCallbackEvent(Name* name, Address entry_point) override; |
238 void RegExpCodeCreateEvent(AbstractCode* code, String* source) override; | 230 void RegExpCodeCreateEvent(AbstractCode* code, String* source) override; |
239 void SetterCallbackEvent(Name* name, Address entry_point) override; | 231 void SetterCallbackEvent(Name* name, Address entry_point) override; |
240 void SharedFunctionInfoMoveEvent(Address from, Address to) override {} | 232 void SharedFunctionInfoMoveEvent(Address from, Address to) override {} |
241 | 233 |
242 bool is_profiling() const { return is_profiling_; } | 234 bool is_profiling() const { return is_profiling_; } |
243 | 235 |
244 ProfileGenerator* generator() const { return generator_; } | 236 ProfileGenerator* generator() const { return generator_; } |
245 ProfilerEventsProcessor* processor() const { return processor_; } | 237 ProfilerEventsProcessor* processor() const { return processor_; } |
246 Isolate* isolate() const { return isolate_; } | 238 Isolate* isolate() const { return isolate_; } |
(...skipping 17 matching lines...) Expand all Loading... |
264 bool is_profiling_; | 256 bool is_profiling_; |
265 | 257 |
266 DISALLOW_COPY_AND_ASSIGN(CpuProfiler); | 258 DISALLOW_COPY_AND_ASSIGN(CpuProfiler); |
267 }; | 259 }; |
268 | 260 |
269 } // namespace internal | 261 } // namespace internal |
270 } // namespace v8 | 262 } // namespace v8 |
271 | 263 |
272 | 264 |
273 #endif // V8_PROFILER_CPU_PROFILER_H_ | 265 #endif // V8_PROFILER_CPU_PROFILER_H_ |
OLD | NEW |