| Index: base/tracked_objects.h
|
| diff --git a/base/tracked_objects.h b/base/tracked_objects.h
|
| index 34c3667d4ca77eab92497d7c2cb8fd6b9d6fa452..964326511b23355f0bca71b1671919d8cb3e8548 100644
|
| --- a/base/tracked_objects.h
|
| +++ b/base/tracked_objects.h
|
| @@ -18,6 +18,7 @@
|
| #include "base/gtest_prod_util.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/location.h"
|
| +#include "base/process/process_handle.h"
|
| #include "base/profiler/alternate_timer.h"
|
| #include "base/profiler/tracked_time.h"
|
| #include "base/synchronization/lock.h"
|
| @@ -147,10 +148,14 @@ struct TrackingInfo;
|
| // TaskSnapshot instances, so that such instances can be sorted and
|
| // aggregated (and remain frozen during our processing).
|
| //
|
| -// The ProcessDataSnapshot struct is a serialized representation of the list
|
| -// of ThreadData objects for a process. It holds a set of TaskSnapshots
|
| -// and tracks parent/child relationships for the executed tasks. The statistics
|
| -// in a snapshot are gathered asynhcronously relative to their ongoing updates.
|
| +// Profiling consists of phases. The concrete phase in the sequence of phases is
|
| +// identified by its 0-based index.
|
| +//
|
| +// The ProcessDataPhaseSnapshot struct is a serialized representation of the
|
| +// list of ThreadData objects for a process for a concrete profiling phase. It
|
| +// holds a set of TaskSnapshots and tracks parent/child relationships for the
|
| +// executed tasks. The statistics in a snapshot are gathered asynhcronously
|
| +// relative to their ongoing updates.
|
| // It is possible, though highly unlikely, that stats could be incorrectly
|
| // recorded by this process (all data is held in 32 bit ints, but we are not
|
| // atomically collecting all data, so we could have count that does not, for
|
| @@ -342,9 +347,15 @@ struct BASE_EXPORT TaskSnapshot {
|
| // We also have a linked list of ThreadData instances, and that list is used to
|
| // harvest data from all existing instances.
|
|
|
| +struct ProcessDataPhaseSnapshot;
|
| struct ProcessDataSnapshot;
|
| class BASE_EXPORT TaskStopwatch;
|
|
|
| +// Map from profiling phase number to the process-wide snapshotted
|
| +// representation of the list of ThreadData objects that died during the given
|
| +// phase.
|
| +typedef std::map<int, ProcessDataPhaseSnapshot> PhasedProcessDataSnapshotMap;
|
| +
|
| class BASE_EXPORT ThreadData {
|
| public:
|
| // Current allowable states of the tracking system. The states can vary
|
| @@ -376,8 +387,9 @@ class BASE_EXPORT ThreadData {
|
| // This may return NULL if the system is disabled for any reason.
|
| static ThreadData* Get();
|
|
|
| - // Fills |process_data| with all the recursive results in our process.
|
| - static void Snapshot(ProcessDataSnapshot* process_data);
|
| + // Fills |process_data_snapshot| with phased snapshots of all profiling
|
| + // phases, including the current one.
|
| + static void Snapshot(ProcessDataSnapshot* process_data_snapshot);
|
|
|
| // Finds (or creates) a place to count births from the given location in this
|
| // thread, and increment that tally.
|
| @@ -403,16 +415,14 @@ class BASE_EXPORT ThreadData {
|
| // the task.
|
| // The |end_of_run| was just obtained by a call to Now() (just after the task
|
| // finished).
|
| - static void TallyRunOnWorkerThreadIfTracking(
|
| - const Births* birth,
|
| - const TrackedTime& time_posted,
|
| - const TaskStopwatch& stopwatch);
|
| + static void TallyRunOnWorkerThreadIfTracking(const Births* birth,
|
| + const TrackedTime& time_posted,
|
| + const TaskStopwatch& stopwatch);
|
|
|
| // Record the end of execution in region, generally corresponding to a scope
|
| // being exited.
|
| - static void TallyRunInAScopedRegionIfTracking(
|
| - const Births* birth,
|
| - const TaskStopwatch& stopwatch);
|
| + static void TallyRunInAScopedRegionIfTracking(const Births* birth,
|
| + const TaskStopwatch& stopwatch);
|
|
|
| const std::string& thread_name() const { return thread_name_; }
|
|
|
| @@ -514,16 +524,21 @@ class BASE_EXPORT ThreadData {
|
| // Snapshot (under a lock) the profiled data for the tasks in each ThreadData
|
| // instance. Also updates the |birth_counts| tally for each task to keep
|
| // track of the number of living instances of the task.
|
| - static void SnapshotAllExecutedTasks(ProcessDataSnapshot* process_data,
|
| - BirthCountMap* birth_counts);
|
| + static void SnapshotAllExecutedTasks(
|
| + ProcessDataPhaseSnapshot* process_data_phase,
|
| + BirthCountMap* birth_counts);
|
| +
|
| + // Fills |process_data_phase| with all the recursive results in our process.
|
| + static void SnapshotCurrentPhase(
|
| + ProcessDataPhaseSnapshot* process_data_phase);
|
|
|
| // Snapshots (under a lock) the profiled data for the tasks for this thread
|
| // and writes all of the executed tasks' data -- i.e. the data for the tasks
|
| - // with with entries in the death_map_ -- into |process_data|. Also updates
|
| - // the |birth_counts| tally for each task to keep track of the number of
|
| - // living instances of the task -- that is, each task maps to the number of
|
| + // with with entries in the death_map_ -- into |process_data_phase|. Also
|
| + // updates the |birth_counts| tally for each task to keep track of the number
|
| + // of living instances of the task -- that is, each task maps to the number of
|
| // births for the task that have not yet been balanced by a death.
|
| - void SnapshotExecutedTasks(ProcessDataSnapshot* process_data,
|
| + void SnapshotExecutedTasks(ProcessDataPhaseSnapshot* process_data_phase,
|
| BirthCountMap* birth_counts);
|
|
|
| // Using our lock, make a copy of the specified maps. This call may be made
|
| @@ -747,16 +762,29 @@ struct BASE_EXPORT ParentChildPairSnapshot {
|
| };
|
|
|
| //------------------------------------------------------------------------------
|
| -// A snapshotted representation of the list of ThreadData objects for a process.
|
| +// A snapshotted representation of the list of ThreadData objects for a process,
|
| +// for a single profiling phase.
|
| +
|
| +struct BASE_EXPORT ProcessDataPhaseSnapshot {
|
| + public:
|
| + ProcessDataPhaseSnapshot();
|
| + ~ProcessDataPhaseSnapshot();
|
| +
|
| + std::vector<TaskSnapshot> tasks;
|
| + std::vector<ParentChildPairSnapshot> descendants;
|
| +};
|
| +
|
| +//------------------------------------------------------------------------------
|
| +// A snapshotted representation of the list of ThreadData objects for a process,
|
| +// for all profiling phases, including the current one.
|
|
|
| struct BASE_EXPORT ProcessDataSnapshot {
|
| public:
|
| ProcessDataSnapshot();
|
| ~ProcessDataSnapshot();
|
|
|
| - std::vector<TaskSnapshot> tasks;
|
| - std::vector<ParentChildPairSnapshot> descendants;
|
| - int process_id;
|
| + PhasedProcessDataSnapshotMap phased_process_data_snapshots;
|
| + base::ProcessId process_id;
|
| };
|
|
|
| } // namespace tracked_objects
|
|
|