| Index: base/tracked_objects_unittest.cc | 
| diff --git a/base/tracked_objects_unittest.cc b/base/tracked_objects_unittest.cc | 
| index 70d9601cd0f9be78570cabab1ce23d7b6413917e..b64e5fdd4e235868a8ad090175e105ab72a9e619 100644 | 
| --- a/base/tracked_objects_unittest.cc | 
| +++ b/base/tracked_objects_unittest.cc | 
| @@ -22,6 +22,13 @@ const char kWorkerThreadName[] = "WorkerThread-1"; | 
| const char kMainThreadName[] = "SomeMainThreadName"; | 
| const char kStillAlive[] = "Still_Alive"; | 
|  | 
| +const int32_t kAllocOps = 23; | 
| +const int32_t kFreeOps = 27; | 
| +const int32_t kAllocatedBytes = 59934; | 
| +const int32_t kFreedBytes = 2 * kAllocatedBytes; | 
| +const int32_t kAllocOverheadBytes = kAllocOps * 8; | 
| +const int32_t kMaxAllocatedBytes = kAllocatedBytes / 2; | 
| + | 
| namespace tracked_objects { | 
|  | 
| class TrackedObjectsTest : public testing::Test { | 
| @@ -237,7 +244,7 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) { | 
| EXPECT_EQ(kWorkerThreadName, process_data_phase.tasks[0].death_thread_name); | 
| } | 
|  | 
| -TEST_F(TrackedObjectsTest, DeathDataTestRecordDeath) { | 
| +TEST_F(TrackedObjectsTest, DeathDataTestRecordDurations) { | 
| ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); | 
|  | 
| std::unique_ptr<DeathData> data(new DeathData()); | 
| @@ -255,7 +262,7 @@ TEST_F(TrackedObjectsTest, DeathDataTestRecordDeath) { | 
| int32_t queue_ms = 8; | 
|  | 
| const int kUnrandomInt = 0;  // Fake random int that ensure we sample data. | 
| -  data->RecordDeath(queue_ms, run_ms, kUnrandomInt); | 
| +  data->RecordDurations(queue_ms, run_ms, kUnrandomInt); | 
| EXPECT_EQ(data->run_duration_sum(), run_ms); | 
| EXPECT_EQ(data->run_duration_max(), run_ms); | 
| EXPECT_EQ(data->run_duration_sample(), run_ms); | 
| @@ -265,7 +272,7 @@ TEST_F(TrackedObjectsTest, DeathDataTestRecordDeath) { | 
| EXPECT_EQ(data->count(), 1); | 
| EXPECT_EQ(nullptr, data->last_phase_snapshot()); | 
|  | 
| -  data->RecordDeath(queue_ms, run_ms, kUnrandomInt); | 
| +  data->RecordDurations(queue_ms, run_ms, kUnrandomInt); | 
| EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms); | 
| EXPECT_EQ(data->run_duration_max(), run_ms); | 
| EXPECT_EQ(data->run_duration_sample(), run_ms); | 
| @@ -276,18 +283,77 @@ TEST_F(TrackedObjectsTest, DeathDataTestRecordDeath) { | 
| EXPECT_EQ(nullptr, data->last_phase_snapshot()); | 
| } | 
|  | 
| +TEST_F(TrackedObjectsTest, DeathDataTestRecordAllocations) { | 
| +  ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); | 
| + | 
| +  std::unique_ptr<DeathData> data(new DeathData()); | 
| +  ASSERT_NE(data, nullptr); | 
| + | 
| +  EXPECT_EQ(data->alloc_ops(), 0); | 
| +  EXPECT_EQ(data->free_ops(), 0); | 
| +  EXPECT_EQ(data->allocated_bytes(), 0); | 
| +  EXPECT_EQ(data->freed_bytes(), 0); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), 0); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), 0); | 
| + | 
| +  EXPECT_EQ(nullptr, data->last_phase_snapshot()); | 
| + | 
| +  data->RecordAllocations(kAllocOps, kFreeOps, kAllocatedBytes, kFreedBytes, | 
| +                          kAllocOverheadBytes, kMaxAllocatedBytes); | 
| +  EXPECT_EQ(data->alloc_ops(), kAllocOps); | 
| +  EXPECT_EQ(data->free_ops(), kFreeOps); | 
| +  EXPECT_EQ(data->allocated_bytes(), kAllocatedBytes); | 
| +  EXPECT_EQ(data->freed_bytes(), kFreedBytes); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), kAllocOverheadBytes); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), kMaxAllocatedBytes); | 
| + | 
| +  // Record another batch, with a smaller max. | 
| +  const int32_t kSmallerMaxAllocatedBytes = kMaxAllocatedBytes / 2; | 
| +  data->RecordAllocations(kAllocOps, kFreeOps, kAllocatedBytes, kFreedBytes, | 
| +                          kAllocOverheadBytes, kSmallerMaxAllocatedBytes); | 
| +  EXPECT_EQ(data->alloc_ops(), 2 * kAllocOps); | 
| +  EXPECT_EQ(data->free_ops(), 2 * kFreeOps); | 
| +  EXPECT_EQ(data->allocated_bytes(), 2 * kAllocatedBytes); | 
| +  EXPECT_EQ(data->freed_bytes(), 2 * kFreedBytes); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), 2 * kAllocOverheadBytes); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), kMaxAllocatedBytes); | 
| + | 
| +  // Now with a larger max. | 
| +  const int32_t kLargerMaxAllocatedBytes = kMaxAllocatedBytes * 2; | 
| +  data->RecordAllocations(kAllocOps, kFreeOps, kAllocatedBytes, kFreedBytes, | 
| +                          kAllocOverheadBytes, kLargerMaxAllocatedBytes); | 
| +  EXPECT_EQ(data->alloc_ops(), 3 * kAllocOps); | 
| +  EXPECT_EQ(data->free_ops(), 3 * kFreeOps); | 
| +  EXPECT_EQ(data->allocated_bytes(), 3 * kAllocatedBytes); | 
| +  EXPECT_EQ(data->freed_bytes(), 3 * kFreedBytes); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), 3 * kAllocOverheadBytes); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), kLargerMaxAllocatedBytes); | 
| + | 
| +  // Saturate everything. | 
| +  data->RecordAllocations(INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX); | 
| +  EXPECT_EQ(data->alloc_ops(), INT_MAX); | 
| +  EXPECT_EQ(data->free_ops(), INT_MAX); | 
| +  EXPECT_EQ(data->allocated_bytes(), INT_MAX); | 
| +  EXPECT_EQ(data->freed_bytes(), INT_MAX); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), INT_MAX); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), INT_MAX); | 
| +} | 
| + | 
| TEST_F(TrackedObjectsTest, DeathDataTest2Phases) { | 
| ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); | 
|  | 
| std::unique_ptr<DeathData> data(new DeathData()); | 
| ASSERT_NE(data, nullptr); | 
|  | 
| -  int32_t run_ms = 42; | 
| -  int32_t queue_ms = 8; | 
| +  const int32_t run_ms = 42; | 
| +  const int32_t queue_ms = 8; | 
|  | 
| const int kUnrandomInt = 0;  // Fake random int that ensure we sample data. | 
| -  data->RecordDeath(queue_ms, run_ms, kUnrandomInt); | 
| -  data->RecordDeath(queue_ms, run_ms, kUnrandomInt); | 
| +  data->RecordDurations(queue_ms, run_ms, kUnrandomInt); | 
| +  data->RecordDurations(queue_ms, run_ms, kUnrandomInt); | 
| + | 
| +  data->RecordAllocations(kAllocOps, kFreeOps, kAllocatedBytes, kFreedBytes, | 
| +                          kAllocOverheadBytes, kMaxAllocatedBytes); | 
|  | 
| data->OnProfilingPhaseCompleted(123); | 
| EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms); | 
| @@ -297,6 +363,14 @@ TEST_F(TrackedObjectsTest, DeathDataTest2Phases) { | 
| EXPECT_EQ(data->queue_duration_max(), 0); | 
| EXPECT_EQ(data->queue_duration_sample(), queue_ms); | 
| EXPECT_EQ(data->count(), 2); | 
| + | 
| +  EXPECT_EQ(data->alloc_ops(), kAllocOps); | 
| +  EXPECT_EQ(data->free_ops(), kFreeOps); | 
| +  EXPECT_EQ(data->allocated_bytes(), kAllocatedBytes); | 
| +  EXPECT_EQ(data->freed_bytes(), kFreedBytes); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), kAllocOverheadBytes); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), kMaxAllocatedBytes); | 
| + | 
| ASSERT_NE(nullptr, data->last_phase_snapshot()); | 
| EXPECT_EQ(123, data->last_phase_snapshot()->profiling_phase); | 
| EXPECT_EQ(2, data->last_phase_snapshot()->death_data.count); | 
| @@ -311,12 +385,26 @@ TEST_F(TrackedObjectsTest, DeathDataTest2Phases) { | 
| data->last_phase_snapshot()->death_data.queue_duration_max); | 
| EXPECT_EQ(queue_ms, | 
| data->last_phase_snapshot()->death_data.queue_duration_sample); | 
| + | 
| +  EXPECT_EQ(kAllocOps, data->last_phase_snapshot()->death_data.alloc_ops); | 
| +  EXPECT_EQ(kFreeOps, data->last_phase_snapshot()->death_data.free_ops); | 
| +  EXPECT_EQ(kAllocatedBytes, | 
| +            data->last_phase_snapshot()->death_data.allocated_bytes); | 
| +  EXPECT_EQ(kFreedBytes, data->last_phase_snapshot()->death_data.freed_bytes); | 
| +  EXPECT_EQ(kAllocOverheadBytes, | 
| +            data->last_phase_snapshot()->death_data.alloc_overhead_bytes); | 
| +  EXPECT_EQ(kMaxAllocatedBytes, | 
| +            data->last_phase_snapshot()->death_data.max_allocated_bytes); | 
| + | 
| EXPECT_EQ(nullptr, data->last_phase_snapshot()->prev); | 
|  | 
| -  int32_t run_ms1 = 21; | 
| -  int32_t queue_ms1 = 4; | 
| +  const int32_t run_ms1 = 21; | 
| +  const int32_t queue_ms1 = 4; | 
| + | 
| +  data->RecordDurations(queue_ms1, run_ms1, kUnrandomInt); | 
| +  data->RecordAllocations(kAllocOps, kFreeOps, kAllocatedBytes, kFreedBytes, | 
| +                          kAllocOverheadBytes, kMaxAllocatedBytes); | 
|  | 
| -  data->RecordDeath(queue_ms1, run_ms1, kUnrandomInt); | 
| EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms + run_ms1); | 
| EXPECT_EQ(data->run_duration_max(), run_ms1); | 
| EXPECT_EQ(data->run_duration_sample(), run_ms1); | 
| @@ -324,6 +412,14 @@ TEST_F(TrackedObjectsTest, DeathDataTest2Phases) { | 
| EXPECT_EQ(data->queue_duration_max(), queue_ms1); | 
| EXPECT_EQ(data->queue_duration_sample(), queue_ms1); | 
| EXPECT_EQ(data->count(), 3); | 
| + | 
| +  EXPECT_EQ(data->alloc_ops(), 2 * kAllocOps); | 
| +  EXPECT_EQ(data->free_ops(), 2 * kFreeOps); | 
| +  EXPECT_EQ(data->allocated_bytes(), 2 * kAllocatedBytes); | 
| +  EXPECT_EQ(data->freed_bytes(), 2 * kFreedBytes); | 
| +  EXPECT_EQ(data->alloc_overhead_bytes(), 2 * kAllocOverheadBytes); | 
| +  EXPECT_EQ(data->max_allocated_bytes(), kMaxAllocatedBytes); | 
| + | 
| ASSERT_NE(nullptr, data->last_phase_snapshot()); | 
| EXPECT_EQ(123, data->last_phase_snapshot()->profiling_phase); | 
| EXPECT_EQ(2, data->last_phase_snapshot()->death_data.count); | 
| @@ -338,6 +434,17 @@ TEST_F(TrackedObjectsTest, DeathDataTest2Phases) { | 
| data->last_phase_snapshot()->death_data.queue_duration_max); | 
| EXPECT_EQ(queue_ms, | 
| data->last_phase_snapshot()->death_data.queue_duration_sample); | 
| + | 
| +  EXPECT_EQ(kAllocOps, data->last_phase_snapshot()->death_data.alloc_ops); | 
| +  EXPECT_EQ(kFreeOps, data->last_phase_snapshot()->death_data.free_ops); | 
| +  EXPECT_EQ(kAllocatedBytes, | 
| +            data->last_phase_snapshot()->death_data.allocated_bytes); | 
| +  EXPECT_EQ(kFreedBytes, data->last_phase_snapshot()->death_data.freed_bytes); | 
| +  EXPECT_EQ(kAllocOverheadBytes, | 
| +            data->last_phase_snapshot()->death_data.alloc_overhead_bytes); | 
| +  EXPECT_EQ(kMaxAllocatedBytes, | 
| +            data->last_phase_snapshot()->death_data.max_allocated_bytes); | 
| + | 
| EXPECT_EQ(nullptr, data->last_phase_snapshot()->prev); | 
| } | 
|  | 
| @@ -353,6 +460,13 @@ TEST_F(TrackedObjectsTest, Delta) { | 
| snapshot.queue_duration_max = 101; | 
| snapshot.queue_duration_sample = 26; | 
|  | 
| +  snapshot.alloc_ops = 95; | 
| +  snapshot.free_ops = 90; | 
| +  snapshot.allocated_bytes = 10240; | 
| +  snapshot.freed_bytes = 4096; | 
| +  snapshot.alloc_overhead_bytes = 950; | 
| +  snapshot.max_allocated_bytes = 10240; | 
| + | 
| DeathDataSnapshot older_snapshot; | 
| older_snapshot.count = 2; | 
| older_snapshot.run_duration_sum = 95; | 
| @@ -362,6 +476,13 @@ TEST_F(TrackedObjectsTest, Delta) { | 
| older_snapshot.queue_duration_max = 99; | 
| older_snapshot.queue_duration_sample = 21; | 
|  | 
| +  older_snapshot.alloc_ops = 45; | 
| +  older_snapshot.free_ops = 40; | 
| +  older_snapshot.allocated_bytes = 4096; | 
| +  older_snapshot.freed_bytes = 2048; | 
| +  older_snapshot.alloc_overhead_bytes = 450; | 
| +  older_snapshot.max_allocated_bytes = 10200; | 
| + | 
| const DeathDataSnapshot& delta = snapshot.Delta(older_snapshot); | 
| EXPECT_EQ(8, delta.count); | 
| EXPECT_EQ(5, delta.run_duration_sum); | 
| @@ -370,6 +491,13 @@ TEST_F(TrackedObjectsTest, Delta) { | 
| EXPECT_EQ(10, delta.queue_duration_sum); | 
| EXPECT_EQ(101, delta.queue_duration_max); | 
| EXPECT_EQ(26, delta.queue_duration_sample); | 
| + | 
| +  EXPECT_EQ(50, delta.alloc_ops); | 
| +  EXPECT_EQ(50, delta.free_ops); | 
| +  EXPECT_EQ(6144, delta.allocated_bytes); | 
| +  EXPECT_EQ(2048, delta.freed_bytes); | 
| +  EXPECT_EQ(500, delta.alloc_overhead_bytes); | 
| +  EXPECT_EQ(10240, delta.max_allocated_bytes); | 
| } | 
|  | 
| TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) { | 
|  |