Chromium Code Reviews| Index: base/profiler/stack_sampling_profiler.h |
| diff --git a/base/profiler/stack_sampling_profiler.h b/base/profiler/stack_sampling_profiler.h |
| index cf1daf7e16d4b1846fa1b20a3c79f0f2578ce100..30ca1f00f542d562d06dec72ceaf224e20e7d6ef 100644 |
| --- a/base/profiler/stack_sampling_profiler.h |
| +++ b/base/profiler/stack_sampling_profiler.h |
| @@ -11,6 +11,7 @@ |
| #include <string> |
| #include <vector> |
| +#include "base/atomicops.h" |
| #include "base/base_export.h" |
| #include "base/callback.h" |
| #include "base/files/file_path.h" |
| @@ -64,6 +65,12 @@ class NativeStackSamplerTestDelegate; |
| // record those modules associated with the recorded stack frames. |
| class BASE_EXPORT StackSamplingProfiler { |
| public: |
| + // These types are defined simply for clarity in places that define them |
| + // (using this as the base type for an enum) and in methods that take them |
| + // as parameters. |
| + using ProcessPhase = int; |
| + using ProcessActivity = int; |
|
Mike Wittman
2016/11/02 17:14:39
Can we avoid defining these typedefs and just use
bcwhite
2016/11/02 20:10:45
I had wanted to clearly define what is being passe
|
| + |
| // Module represents the module (DLL or exe) corresponding to a stack frame. |
| struct BASE_EXPORT Module { |
| Module(); |
| @@ -107,8 +114,28 @@ class BASE_EXPORT StackSamplingProfiler { |
| size_t module_index; |
| }; |
| - // Sample represents a set of stack frames. |
| - using Sample = std::vector<Frame>; |
| + // Sample represents a set of stack frames with some extra information. |
| + struct BASE_EXPORT Sample { |
| + Sample(); |
| + Sample(const Sample& sample); |
| + ~Sample(); |
| + |
| + // These constructors are used only during testing. |
| + Sample(const Frame& frame); |
| + Sample(const std::vector<Frame>& frames); |
| + |
| + // The entire stack frame when the sample is taken. |
| + std::vector<Frame> frames; |
| + |
| + // A bit-field indicating which process phases have passed. This can be |
| + // used to tell where in the process lifetime the samples are taken. See |
| + // ProcessPhase, above. |
| + uint32_t process_phases = 0; |
| + |
| + // A bit-field indicating activities which were active when the frame was |
| + // captured. See ProcessActivity, above. |
| + uint32_t current_activities = 0; |
| + }; |
| // CallStackProfile represents a set of samples. |
| struct BASE_EXPORT CallStackProfile { |
| @@ -201,6 +228,12 @@ class BASE_EXPORT StackSamplingProfiler { |
| // whichever occurs first. |
| void Stop(); |
| + // Set the current system state that is recorded with each captured stack |
| + // frame. These are all thread-safe so can be called from anywhere. |
|
Mike Wittman
2016/11/02 17:14:39
Document that the valid values are between 0 and 3
bcwhite
2016/11/02 20:10:45
Done.
|
| + static void SetProcessPhase(ProcessPhase phase); |
| + static void RecordActivityBegin(ProcessActivity activity); |
| + static void RecordActivityEnd(ProcessActivity activity); |
| + |
| private: |
| // SamplingThread is a separate thread used to suspend and sample stacks from |
| // the target thread. |
| @@ -243,6 +276,17 @@ class BASE_EXPORT StackSamplingProfiler { |
| DISALLOW_COPY_AND_ASSIGN(SamplingThread); |
| }; |
| + // Adds "phases" and "activities" annotations to a Sample. |
| + static void RecordAnnotations(Sample* sample); |
| + |
| + // These global variables hold current system state. These values are |
| + // recorded with every captured sample, done on a separate thread which is |
| + // why updates to these must be atomic. A PostTask to move the the updates |
| + // to that thread would skew the timing and a lock could result in deadlock |
| + // if the thread making a change was also being profiled and got stopped. |
| + static subtle::Atomic32 process_phases_; |
| + static subtle::Atomic32 current_activities_; |
| + |
| // The thread whose stack will be sampled. |
| PlatformThreadId thread_id_; |
| @@ -263,6 +307,12 @@ class BASE_EXPORT StackSamplingProfiler { |
| // done in tests and by the metrics provider code. |
| BASE_EXPORT bool operator==(const StackSamplingProfiler::Module& a, |
| const StackSamplingProfiler::Module& b); |
| +BASE_EXPORT bool operator==(const StackSamplingProfiler::Sample& a, |
| + const StackSamplingProfiler::Sample& b); |
| +BASE_EXPORT bool operator!=(const StackSamplingProfiler::Sample& a, |
| + const StackSamplingProfiler::Sample& b); |
| +BASE_EXPORT bool operator<(const StackSamplingProfiler::Sample& a, |
| + const StackSamplingProfiler::Sample& b); |
| BASE_EXPORT bool operator==(const StackSamplingProfiler::Frame& a, |
| const StackSamplingProfiler::Frame& b); |
| BASE_EXPORT bool operator<(const StackSamplingProfiler::Frame& a, |