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_CPU_PROFILER_H_ | 5 #ifndef V8_CPU_PROFILER_H_ |
6 #define V8_CPU_PROFILER_H_ | 6 #define V8_CPU_PROFILER_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/base/atomicops.h" | 9 #include "src/base/atomicops.h" |
| 10 #include "src/base/platform/time.h" |
10 #include "src/circular-queue.h" | 11 #include "src/circular-queue.h" |
11 #include "src/platform/time.h" | |
12 #include "src/sampler.h" | 12 #include "src/sampler.h" |
13 #include "src/unbound-queue.h" | 13 #include "src/unbound-queue.h" |
14 | 14 |
15 namespace v8 { | 15 namespace v8 { |
16 namespace internal { | 16 namespace internal { |
17 | 17 |
18 // Forward declarations. | 18 // Forward declarations. |
19 class CodeEntry; | 19 class CodeEntry; |
20 class CodeMap; | 20 class CodeMap; |
21 class CompilationInfo; | 21 class CompilationInfo; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 CodeEventRecord generic; | 115 CodeEventRecord generic; |
116 #define DECLARE_CLASS(ignore, type) type type##_; | 116 #define DECLARE_CLASS(ignore, type) type type##_; |
117 CODE_EVENTS_TYPE_LIST(DECLARE_CLASS) | 117 CODE_EVENTS_TYPE_LIST(DECLARE_CLASS) |
118 #undef DECLARE_TYPE | 118 #undef DECLARE_TYPE |
119 }; | 119 }; |
120 }; | 120 }; |
121 | 121 |
122 | 122 |
123 // This class implements both the profile events processor thread and | 123 // This class implements both the profile events processor thread and |
124 // methods called by event producers: VM and stack sampler threads. | 124 // methods called by event producers: VM and stack sampler threads. |
125 class ProfilerEventsProcessor : public Thread { | 125 class ProfilerEventsProcessor : public base::Thread { |
126 public: | 126 public: |
127 ProfilerEventsProcessor(ProfileGenerator* generator, | 127 ProfilerEventsProcessor(ProfileGenerator* generator, |
128 Sampler* sampler, | 128 Sampler* sampler, |
129 TimeDelta period); | 129 base::TimeDelta period); |
130 virtual ~ProfilerEventsProcessor() {} | 130 virtual ~ProfilerEventsProcessor() {} |
131 | 131 |
132 // Thread control. | 132 // Thread control. |
133 virtual void Run(); | 133 virtual void Run(); |
134 void StopSynchronously(); | 134 void StopSynchronously(); |
135 INLINE(bool running()) { return running_; } | 135 INLINE(bool running()) { return running_; } |
136 void Enqueue(const CodeEventsContainer& event); | 136 void Enqueue(const CodeEventsContainer& event); |
137 | 137 |
138 // Puts current stack into tick sample events buffer. | 138 // Puts current stack into tick sample events buffer. |
139 void AddCurrentStack(Isolate* isolate); | 139 void AddCurrentStack(Isolate* isolate); |
(...skipping 18 matching lines...) Expand all Loading... |
158 OneSampleProcessed, | 158 OneSampleProcessed, |
159 FoundSampleForNextCodeEvent, | 159 FoundSampleForNextCodeEvent, |
160 NoSamplesInQueue | 160 NoSamplesInQueue |
161 }; | 161 }; |
162 SampleProcessingResult ProcessOneSample(); | 162 SampleProcessingResult ProcessOneSample(); |
163 | 163 |
164 ProfileGenerator* generator_; | 164 ProfileGenerator* generator_; |
165 Sampler* sampler_; | 165 Sampler* sampler_; |
166 bool running_; | 166 bool running_; |
167 // Sampling period in microseconds. | 167 // Sampling period in microseconds. |
168 const TimeDelta period_; | 168 const base::TimeDelta period_; |
169 UnboundQueue<CodeEventsContainer> events_buffer_; | 169 UnboundQueue<CodeEventsContainer> events_buffer_; |
170 static const size_t kTickSampleBufferSize = 1 * MB; | 170 static const size_t kTickSampleBufferSize = 1 * MB; |
171 static const size_t kTickSampleQueueLength = | 171 static const size_t kTickSampleQueueLength = |
172 kTickSampleBufferSize / sizeof(TickSampleEventRecord); | 172 kTickSampleBufferSize / sizeof(TickSampleEventRecord); |
173 SamplingCircularQueue<TickSampleEventRecord, | 173 SamplingCircularQueue<TickSampleEventRecord, |
174 kTickSampleQueueLength> ticks_buffer_; | 174 kTickSampleQueueLength> ticks_buffer_; |
175 UnboundQueue<TickSampleEventRecord> ticks_from_vm_buffer_; | 175 UnboundQueue<TickSampleEventRecord> ticks_from_vm_buffer_; |
176 unsigned last_code_event_id_; | 176 unsigned last_code_event_id_; |
177 unsigned last_processed_code_event_id_; | 177 unsigned last_processed_code_event_id_; |
178 }; | 178 }; |
(...skipping 14 matching lines...) Expand all Loading... |
193 public: | 193 public: |
194 explicit CpuProfiler(Isolate* isolate); | 194 explicit CpuProfiler(Isolate* isolate); |
195 | 195 |
196 CpuProfiler(Isolate* isolate, | 196 CpuProfiler(Isolate* isolate, |
197 CpuProfilesCollection* test_collection, | 197 CpuProfilesCollection* test_collection, |
198 ProfileGenerator* test_generator, | 198 ProfileGenerator* test_generator, |
199 ProfilerEventsProcessor* test_processor); | 199 ProfilerEventsProcessor* test_processor); |
200 | 200 |
201 virtual ~CpuProfiler(); | 201 virtual ~CpuProfiler(); |
202 | 202 |
203 void set_sampling_interval(TimeDelta value); | 203 void set_sampling_interval(base::TimeDelta value); |
204 void StartProfiling(const char* title, bool record_samples = false); | 204 void StartProfiling(const char* title, bool record_samples = false); |
205 void StartProfiling(String* title, bool record_samples); | 205 void StartProfiling(String* title, bool record_samples); |
206 CpuProfile* StopProfiling(const char* title); | 206 CpuProfile* StopProfiling(const char* title); |
207 CpuProfile* StopProfiling(String* title); | 207 CpuProfile* StopProfiling(String* title); |
208 int GetProfilesCount(); | 208 int GetProfilesCount(); |
209 CpuProfile* GetProfile(int index); | 209 CpuProfile* GetProfile(int index); |
210 void DeleteAllProfiles(); | 210 void DeleteAllProfiles(); |
211 void DeleteProfile(CpuProfile* profile); | 211 void DeleteProfile(CpuProfile* profile); |
212 | 212 |
213 // Invoked from stack sampler (thread or signal handler.) | 213 // Invoked from stack sampler (thread or signal handler.) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 Isolate* isolate() const { return isolate_; } | 252 Isolate* isolate() const { return isolate_; } |
253 | 253 |
254 private: | 254 private: |
255 void StartProcessorIfNotStarted(); | 255 void StartProcessorIfNotStarted(); |
256 void StopProcessorIfLastProfile(const char* title); | 256 void StopProcessorIfLastProfile(const char* title); |
257 void StopProcessor(); | 257 void StopProcessor(); |
258 void ResetProfiles(); | 258 void ResetProfiles(); |
259 void LogBuiltins(); | 259 void LogBuiltins(); |
260 | 260 |
261 Isolate* isolate_; | 261 Isolate* isolate_; |
262 TimeDelta sampling_interval_; | 262 base::TimeDelta sampling_interval_; |
263 CpuProfilesCollection* profiles_; | 263 CpuProfilesCollection* profiles_; |
264 ProfileGenerator* generator_; | 264 ProfileGenerator* generator_; |
265 ProfilerEventsProcessor* processor_; | 265 ProfilerEventsProcessor* processor_; |
266 bool saved_is_logging_; | 266 bool saved_is_logging_; |
267 bool is_profiling_; | 267 bool is_profiling_; |
268 | 268 |
269 DISALLOW_COPY_AND_ASSIGN(CpuProfiler); | 269 DISALLOW_COPY_AND_ASSIGN(CpuProfiler); |
270 }; | 270 }; |
271 | 271 |
272 } } // namespace v8::internal | 272 } } // namespace v8::internal |
273 | 273 |
274 | 274 |
275 #endif // V8_CPU_PROFILER_H_ | 275 #endif // V8_CPU_PROFILER_H_ |
OLD | NEW |