Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: base/profiler/stack_sampling_profiler.h

Issue 2554123002: Support parallel captures from the StackSamplingProfiler. (Closed)
Patch Set: support for death of thread-under-test Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium 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 BASE_PROFILER_STACK_SAMPLING_PROFILER_H_ 5 #ifndef BASE_PROFILER_STACK_SAMPLING_PROFILER_H_
6 #define BASE_PROFILER_STACK_SAMPLING_PROFILER_H_ 6 #define BASE_PROFILER_STACK_SAMPLING_PROFILER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 214
215 // Initializes the profiler and starts sampling. 215 // Initializes the profiler and starts sampling.
216 void Start(); 216 void Start();
217 217
218 // Stops the profiler and any ongoing sampling. Calling this function is 218 // Stops the profiler and any ongoing sampling. Calling this function is
219 // optional; if not invoked profiling terminates when all the profiling bursts 219 // optional; if not invoked profiling terminates when all the profiling bursts
220 // specified in the SamplingParams are completed or the profiler is destroyed, 220 // specified in the SamplingParams are completed or the profiler is destroyed,
221 // whichever occurs first. 221 // whichever occurs first.
222 void Stop(); 222 void Stop();
223 223
224 // Stops all active profiles and cleans up any resources in anticipation of
225 // a shutdown of the current process.
226 static void Shutdown();
227
228 // Resets the "shutdown" state so that the sampling thread can be restarted.
229 static void UndoShutdownForTesting();
230
231 // Returns whether the sampling thread is currently running or not.
232 static bool IsSamplingThreadRunningForTesting();
233
234 // Sets the auto-shutdown delay time for the sampling thread, in ms. Set this
235 // to zero to disable it.
236 static void SetSamplingThreadIdleShutdownTimeForTesting(int shutdown_ms);
237
238 // Initiates an idle shutdown task, as though the idle timer had expired,
239 // causing the thread to exit if there are no more sampling tasks pending.
240 // This returns immediately. Watch IsSamplingThreadRunningForTesting() to
241 // know when the thread has exited, though it will never do so if it is
242 // not idle.
243 static void InitiateSamplingThreadIdleShutdownForTesting();
244
224 // Set the current system state that is recorded with each captured stack 245 // Set the current system state that is recorded with each captured stack
225 // frame. This is thread-safe so can be called from anywhere. The parameter 246 // frame. This is thread-safe so can be called from anywhere. The parameter
226 // value should be from an enumeration of the appropriate type with values 247 // value should be from an enumeration of the appropriate type with values
227 // ranging from 0 to 31, inclusive. This sets bits within Sample field of 248 // ranging from 0 to 31, inclusive. This sets bits within Sample field of
228 // |process_milestones|. The actual meanings of these bits are defined 249 // |process_milestones|. The actual meanings of these bits are defined
229 // (globally) by the caller(s). 250 // (globally) by the caller(s).
230 static void SetProcessMilestone(int milestone); 251 static void SetProcessMilestone(int milestone);
231 static void ResetAnnotationsForTesting(); 252 static void ResetAnnotationsForTesting();
232 253
233 private: 254 private:
234 // SamplingThread is a separate thread used to suspend and sample stacks from 255 // SamplingThread is a separate thread used to suspend and sample stacks from
235 // the target thread. 256 // the target thread.
236 class SamplingThread : public PlatformThread::Delegate { 257 class SamplingThread;
237 public:
238 // Samples stacks using |native_sampler|. When complete, invokes
239 // |completed_callback| with the collected call stack profiles.
240 // |completed_callback| must be callable on any thread.
241 SamplingThread(std::unique_ptr<NativeStackSampler> native_sampler,
242 const SamplingParams& params,
243 const CompletedCallback& completed_callback);
244 ~SamplingThread() override;
245
246 // PlatformThread::Delegate:
247 void ThreadMain() override;
248
249 void Stop();
250
251 private:
252 // Collects |profile| from a single burst. If the profiler was stopped
253 // during collection, sets |was_stopped| and provides the set of samples
254 // collected up to that point.
255 void CollectProfile(CallStackProfile* profile, TimeDelta* elapsed_time,
256 bool* was_stopped);
257
258 // Collects call stack profiles from all bursts, or until the sampling is
259 // stopped. If stopped before complete, the last profile in
260 // |call_stack_profiles| may contain a partial burst.
261 void CollectProfiles(CallStackProfiles* profiles);
262
263 std::unique_ptr<NativeStackSampler> native_sampler_;
264 const SamplingParams params_;
265
266 // If Stop() is called, it signals this event to force the sampling to
267 // terminate before all the samples specified in |params_| are collected.
268 WaitableEvent stop_event_;
269
270 const CompletedCallback completed_callback_;
271
272 DISALLOW_COPY_AND_ASSIGN(SamplingThread);
273 };
274 258
275 // Adds annotations to a Sample. 259 // Adds annotations to a Sample.
276 static void RecordAnnotations(Sample* sample); 260 static void RecordAnnotations(Sample* sample);
277 261
278 // This global variables holds the current system state and is recorded with 262 // This global variables holds the current system state and is recorded with
279 // every captured sample, done on a separate thread which is why updates to 263 // every captured sample, done on a separate thread which is why updates to
280 // this must be atomic. A PostTask to move the the updates to that thread 264 // this must be atomic. A PostTask to move the the updates to that thread
281 // would skew the timing and a lock could result in deadlock if the thread 265 // would skew the timing and a lock could result in deadlock if the thread
282 // making a change was also being profiled and got stopped. 266 // making a change was also being profiled and got stopped.
283 static subtle::Atomic32 process_milestones_; 267 static subtle::Atomic32 process_milestones_;
284 268
285 // The thread whose stack will be sampled. 269 // The thread whose stack will be sampled.
286 PlatformThreadId thread_id_; 270 PlatformThreadId thread_id_;
287 271
288 const SamplingParams params_; 272 const SamplingParams params_;
289 273
290 std::unique_ptr<SamplingThread> sampling_thread_; 274 const CompletedCallback completed_callback_;
291 PlatformThreadHandle sampling_thread_handle_;
292 275
293 const CompletedCallback completed_callback_; 276 // An ID uniquely identifying this collection to the sampling thread.
277 int collection_id_ = -1;
294 278
295 // Stored until it can be passed to the NativeStackSampler created in Start(). 279 // Stored until it can be passed to the NativeStackSampler created in Start().
296 NativeStackSamplerTestDelegate* const test_delegate_; 280 NativeStackSamplerTestDelegate* const test_delegate_;
297 281
298 DISALLOW_COPY_AND_ASSIGN(StackSamplingProfiler); 282 DISALLOW_COPY_AND_ASSIGN(StackSamplingProfiler);
299 }; 283 };
300 284
301 // These operators permit types to be compared and used in a map of Samples, as 285 // These operators permit types to be compared and used in a map of Samples, as
302 // done in tests and by the metrics provider code. 286 // done in tests and by the metrics provider code.
303 BASE_EXPORT bool operator==(const StackSamplingProfiler::Module& a, 287 BASE_EXPORT bool operator==(const StackSamplingProfiler::Module& a,
304 const StackSamplingProfiler::Module& b); 288 const StackSamplingProfiler::Module& b);
305 BASE_EXPORT bool operator==(const StackSamplingProfiler::Sample& a, 289 BASE_EXPORT bool operator==(const StackSamplingProfiler::Sample& a,
306 const StackSamplingProfiler::Sample& b); 290 const StackSamplingProfiler::Sample& b);
307 BASE_EXPORT bool operator!=(const StackSamplingProfiler::Sample& a, 291 BASE_EXPORT bool operator!=(const StackSamplingProfiler::Sample& a,
308 const StackSamplingProfiler::Sample& b); 292 const StackSamplingProfiler::Sample& b);
309 BASE_EXPORT bool operator<(const StackSamplingProfiler::Sample& a, 293 BASE_EXPORT bool operator<(const StackSamplingProfiler::Sample& a,
310 const StackSamplingProfiler::Sample& b); 294 const StackSamplingProfiler::Sample& b);
311 BASE_EXPORT bool operator==(const StackSamplingProfiler::Frame& a, 295 BASE_EXPORT bool operator==(const StackSamplingProfiler::Frame& a,
312 const StackSamplingProfiler::Frame& b); 296 const StackSamplingProfiler::Frame& b);
313 BASE_EXPORT bool operator<(const StackSamplingProfiler::Frame& a, 297 BASE_EXPORT bool operator<(const StackSamplingProfiler::Frame& a,
314 const StackSamplingProfiler::Frame& b); 298 const StackSamplingProfiler::Frame& b);
315 299
316 } // namespace base 300 } // namespace base
317 301
318 #endif // BASE_PROFILER_STACK_SAMPLING_PROFILER_H_ 302 #endif // BASE_PROFILER_STACK_SAMPLING_PROFILER_H_
OLDNEW
« no previous file with comments | « no previous file | base/profiler/stack_sampling_profiler.cc » ('j') | base/profiler/stack_sampling_profiler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698