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

Unified Diff: base/profiler/stack_sampling_profiler.h

Issue 2554123002: Support parallel captures from the StackSamplingProfiler. (Closed)
Patch Set: merged synchronized-stop CL 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 side-by-side diff with in-line comments
Download patch
Index: base/profiler/stack_sampling_profiler.h
diff --git a/base/profiler/stack_sampling_profiler.h b/base/profiler/stack_sampling_profiler.h
index 622f6e5764a5b4e59fbf0a6eed6c7d328d737fc3..6f25d31fad8bffa8fcb34cab70641872468cb7a6 100644
--- a/base/profiler/stack_sampling_profiler.h
+++ b/base/profiler/stack_sampling_profiler.h
@@ -25,12 +25,20 @@ namespace base {
class NativeStackSampler;
class NativeStackSamplerTestDelegate;
+class WaitableEvent;
// StackSamplingProfiler periodically stops a thread to sample its stack, for
// the purpose of collecting information about which code paths are
// executing. This information is used in aggregate by UMA to identify hot
// and/or janky code paths.
//
+// IMPORTANT: Only threads guaranteed to live beyond the lifetime of the
+// profiler object can be safely sampled. Sampling the activity of the current
+// thread within the scope of this object is safe, but sampling any other
+// thread could cause Bad Things(tm) to occur should that thread exit before
+// sampling is complete; ensure the profiler object gets destructed before
+// exit of the thread under test. USE WITH CAUTION!
+//
Mike Wittman 2017/02/13 22:35:57 If we refactor the constructors to: StackSampli
bcwhite 2017/02/14 14:33:02 I like it. Done.
// Sample StackSamplingProfiler usage:
//
// // Create and customize params as desired.
@@ -205,13 +213,6 @@ class BASE_EXPORT StackSamplingProfiler {
// Stops any profiling currently taking place before destroying the profiler.
~StackSamplingProfiler();
- // The fire-and-forget interface: starts a profiler and allows it to complete
- // without the caller needing to manage the profiler lifetime. May be invoked
- // from any thread, but requires that the calling thread has a message loop.
- static void StartAndRunAsync(PlatformThreadId thread_id,
- const SamplingParams& params,
- const CompletedCallback& callback);
-
// Initializes the profiler and starts sampling.
void Start();
@@ -221,6 +222,27 @@ class BASE_EXPORT StackSamplingProfiler {
// whichever occurs first.
void Stop();
+ // Stops all active profiles and cleans up any resources in anticipation of
+ // a shutdown of the current process.
+ static void Shutdown();
+
+ // Resets the "shutdown" state so that the sampling thread can be restarted.
+ static void UndoShutdownForTesting();
+
+ // Returns whether the sampling thread is currently running or not.
+ static bool IsSamplingThreadRunningForTesting();
+
+ // Sets the auto-shutdown delay time for the sampling thread, in ms. Set this
+ // to zero to disable it.
+ static void SetSamplingThreadIdleShutdownTimeForTesting(int shutdown_ms);
+
+ // Initiates an idle shutdown task, as though the idle timer had expired,
+ // causing the thread to exit if there are no more sampling tasks pending.
+ // This returns immediately. Watch IsSamplingThreadRunningForTesting() to
+ // know when the thread has exited, though it will never do so if it is
+ // not idle.
+ static void InitiateSamplingThreadIdleShutdownForTesting();
+
// Set the current system state that is recorded with each captured stack
// frame. This is thread-safe so can be called from anywhere. The parameter
// value should be from an enumeration of the appropriate type with values
@@ -233,44 +255,7 @@ class BASE_EXPORT StackSamplingProfiler {
private:
// SamplingThread is a separate thread used to suspend and sample stacks from
// the target thread.
- class SamplingThread : public PlatformThread::Delegate {
- public:
- // Samples stacks using |native_sampler|. When complete, invokes
- // |completed_callback| with the collected call stack profiles.
- // |completed_callback| must be callable on any thread.
- SamplingThread(std::unique_ptr<NativeStackSampler> native_sampler,
- const SamplingParams& params,
- const CompletedCallback& completed_callback);
- ~SamplingThread() override;
-
- // PlatformThread::Delegate:
- void ThreadMain() override;
-
- void Stop();
-
- private:
- // Collects |profile| from a single burst. If the profiler was stopped
- // during collection, sets |was_stopped| and provides the set of samples
- // collected up to that point.
- void CollectProfile(CallStackProfile* profile, TimeDelta* elapsed_time,
- bool* was_stopped);
-
- // Collects call stack profiles from all bursts, or until the sampling is
- // stopped. If stopped before complete, the last profile in
- // |call_stack_profiles| may contain a partial burst.
- void CollectProfiles(CallStackProfiles* profiles);
-
- std::unique_ptr<NativeStackSampler> native_sampler_;
- const SamplingParams params_;
-
- // If Stop() is called, it signals this event to force the sampling to
- // terminate before all the samples specified in |params_| are collected.
- WaitableEvent stop_event_;
-
- const CompletedCallback completed_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(SamplingThread);
- };
+ class SamplingThread;
// Adds annotations to a Sample.
static void RecordAnnotations(Sample* sample);
@@ -287,11 +272,18 @@ class BASE_EXPORT StackSamplingProfiler {
const SamplingParams params_;
- std::unique_ptr<SamplingThread> sampling_thread_;
- PlatformThreadHandle sampling_thread_handle_;
-
const CompletedCallback completed_callback_;
+ // An event signaled when all sampling is complete and the callback done.
+ WaitableEvent finished_event_;
+
+ // Object that does the native sampling. This is created during construction
+ // and later passed to the sampling thread when profiling is started.
+ std::unique_ptr<NativeStackSampler> native_sampler_;
+
+ // An ID uniquely identifying this collection to the sampling thread.
+ int collection_id_ = -1;
+
// Stored until it can be passed to the NativeStackSampler created in Start().
NativeStackSamplerTestDelegate* const test_delegate_;

Powered by Google App Engine
This is Rietveld 408576698