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

Unified Diff: base/tracked_objects.h

Issue 1021053003: Delivering the FIRST_NONEMPTY_PAINT phase changing event to base/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@phase_splitting
Patch Set: More asvitkine@ comments. Created 5 years, 9 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
« no previous file with comments | « no previous file | base/tracked_objects.cc » ('j') | base/tracked_objects.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/tracked_objects.h
diff --git a/base/tracked_objects.h b/base/tracked_objects.h
index 964326511b23355f0bca71b1671919d8cb3e8548..5167fc5e32e562b29bffdcf185829d1a85425882 100644
--- a/base/tracked_objects.h
+++ b/base/tracked_objects.h
@@ -246,6 +246,9 @@ class BASE_EXPORT Births: public BirthOnThread {
// When we have a birth we update the count for this birthplace.
void RecordBirth();
+ // Subtracts a value from the birth count.
+ void SubtractBirths(int count);
+
private:
// The number of births on this thread for our location_.
int birth_count_;
@@ -283,7 +286,7 @@ class BASE_EXPORT DeathData {
int32 queue_duration_max() const;
int32 queue_duration_sample() const;
- // Reset all tallies to zero. This is used as a hack on realtime data.
+ // Reset all tallies to zero.
void Clear();
private:
@@ -356,6 +359,11 @@ class BASE_EXPORT TaskStopwatch;
// phase.
typedef std::map<int, ProcessDataPhaseSnapshot> PhasedProcessDataSnapshotMap;
+// Results of resetting death counts to 0. This is a map from the Births pointer
+// to the count of deaths (for tasks with this Births) that were set to 0 by
+// resetting.
+typedef std::map<const Births*, int> DeathResetResults;
+
class BASE_EXPORT ThreadData {
public:
// Current allowable states of the tracking system. The states can vary
@@ -388,8 +396,21 @@ class BASE_EXPORT ThreadData {
static ThreadData* Get();
// Fills |process_data_snapshot| with phased snapshots of all profiling
- // phases, including the current one.
- static void Snapshot(ProcessDataSnapshot* process_data_snapshot);
+ // phases, including the current one, identified by |current_profiling_phase|.
+ // |current_profiling_phase| is necessary because a child process can start
+ // after several phase-changing events, so it needs to receive the current
+ // phase number from the browser process to fill the correct entry for the
+ // current phase in the |process_data_snapshot| map.
+ static void Snapshot(int current_profiling_phase,
+ ProcessDataSnapshot* process_data_snapshot);
+
+ // Called when the current profiling phase, identified by |profiling_phase|,
+ // ends.
+ // |profiling_phase| is necessary because a child process can start after
+ // several phase-changing events, so it needs to receive the phase number from
+ // the browser process to fill the correct entry in the
+ // completed_phases_snapshots_ map.
+ static void OnProfilingPhaseCompletion(int profiling_phase);
// Finds (or creates) a place to count births from the given location in this
// thread, and increment that tally.
@@ -415,13 +436,13 @@ 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,
+ static void TallyRunOnWorkerThreadIfTracking(const Births* births,
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,
+ static void TallyRunInAScopedRegionIfTracking(const Births* births,
const TaskStopwatch& stopwatch);
const std::string& thread_name() const { return thread_name_; }
@@ -517,19 +538,23 @@ class BASE_EXPORT ThreadData {
Births* TallyABirth(const Location& location);
// Find a place to record a death on this thread.
- void TallyADeath(const Births& birth,
+ void TallyADeath(const Births& births,
int32 queue_duration,
const TaskStopwatch& stopwatch);
// 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.
+ // track of the number of living instances of the task. If |reset| is true,
+ // remove all recorded deaths.
static void SnapshotAllExecutedTasks(
+ bool reset,
jar (doing other things) 2015/04/01 17:10:25 This is totally unsafe, and will instigate errors
vadimt 2015/04/06 23:25:12 Done.
ProcessDataPhaseSnapshot* process_data_phase,
BirthCountMap* birth_counts);
// Fills |process_data_phase| with all the recursive results in our process.
+ // If |reset| is true, remove all recorded deaths.
static void SnapshotCurrentPhase(
+ bool reset,
ProcessDataPhaseSnapshot* process_data_phase);
// Snapshots (under a lock) the profiled data for the tasks for this thread
@@ -537,17 +562,32 @@ class BASE_EXPORT ThreadData {
// 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.
+ // births for the task that have not yet been balanced by a death. If
+ // |death_reset_results| is not null, store current death counts in it and
jar (doing other things) 2015/04/01 17:10:25 You can't get away with doing atomic operation so
vadimt 2015/04/06 23:25:12 Done.
+ // remove all recorded deaths.
void SnapshotExecutedTasks(ProcessDataPhaseSnapshot* process_data_phase,
+ DeathResetResults* death_reset_results,
BirthCountMap* birth_counts);
// Using our lock, make a copy of the specified maps. This call may be made
// on non-local threads, which necessitate the use of the lock to prevent
- // the map(s) from being reallocated while they are copied.
+ // the map(s) from being reallocated while they are copied. If
+ // |death_reset_results| is not null, store current death counts in it and
+ // remove all recorded deaths.
void SnapshotMaps(BirthMap* birth_map,
DeathMap* death_map,
+ DeathResetResults* death_reset_results,
ParentChildSet* parent_child_set);
+ // Using our lock, decrease births counts owned by this thread after a death
+ // data's reset.
+ // |death_reset_results| is the result of the cross-threads death count reset
+ // operation that took place before calling this method. For each Birth owned
+ // by this ThreadData, the method will subtract from its birth count the total
+ // number of deaths that were 'forgotten' by resetting death counts to 0.
+ void SubtractDeathResultsFromBirths(
+ const DeathResetResults& death_reset_results);
+
// This method is called by the TLS system when a thread terminates.
// The argument may be NULL if this thread has never tracked a birth or death.
static void OnThreadTermination(void* thread_data);
@@ -612,6 +652,10 @@ class BASE_EXPORT ThreadData {
// We set status_ to SHUTDOWN when we shut down the tracking service.
static Status status_;
+ // Process data snapshots for completed profiling phases.
+ static base::LazyInstance<PhasedProcessDataSnapshotMap>
+ completed_phases_snapshots_;
+
// Link to next instance (null terminated list). Used to globally track all
// registered instances (corresponds to all registered threads where we keep
// data).
« no previous file with comments | « no previous file | base/tracked_objects.cc » ('j') | base/tracked_objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698