diff options
author | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-10 19:43:42 +0000 |
---|---|---|
committer | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-10 19:43:42 +0000 |
commit | 702a12dae9a2ed34362e381df7419c314e4124bf (patch) | |
tree | c9980ba18234d26584d03629600e06996744e7ce /base | |
parent | c07eef4e772952ab4ad0213b581c97e92f00831e (diff) | |
download | chromium_src-702a12dae9a2ed34362e381df7419c314e4124bf.zip chromium_src-702a12dae9a2ed34362e381df7419c314e4124bf.tar.gz chromium_src-702a12dae9a2ed34362e381df7419c314e4124bf.tar.bz2 |
Propogate status setting for profiler to track parents
[Reland: https://src.chromium.org/viewvc/chrome?view=rev&revision=120789
with minor change to avoid race on status change.]
This allows child processes to track ancestry, and report
it to the browser process.
Parent tracking is only turned on based on an
environment variable.
r=rtenneti
Review URL: https://chromiumcodereview.appspot.com/9363007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121491 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/profiler/tracked_time_unittest.cc | 7 | ||||
-rw-r--r-- | base/tracked_objects.cc | 31 | ||||
-rw-r--r-- | base/tracked_objects.h | 10 | ||||
-rw-r--r-- | base/tracked_objects_unittest.cc | 49 |
4 files changed, 58 insertions, 39 deletions
diff --git a/base/profiler/tracked_time_unittest.cc b/base/profiler/tracked_time_unittest.cc index 6491a2f..b85411d 100644 --- a/base/profiler/tracked_time_unittest.cc +++ b/base/profiler/tracked_time_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -76,7 +76,7 @@ TEST(TrackedTimeTest, TrackedTimerVsTimeTicks) { TEST(TrackedTimeTest, TrackedTimerDisabled) { // Check to be sure disabling the collection of data induces a null time // (which we know will return much faster). - if (!ThreadData::InitializeAndSetTrackingStatus(false)) + if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) return; // Since we disabled tracking, we should get a null response. TrackedTime track_now = ThreadData::Now(); @@ -88,7 +88,8 @@ TEST(TrackedTimeTest, TrackedTimerDisabled) { } TEST(TrackedTimeTest, TrackedTimerEnabled) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Make sure that when we enable tracking, we get a real timer result. diff --git a/base/tracked_objects.cc b/base/tracked_objects.cc index e7d7bd1..87af8dc 100644 --- a/base/tracked_objects.cc +++ b/base/tracked_objects.cc @@ -393,7 +393,7 @@ Births* ThreadData::TallyABirthIfActive(const Location& location) { if (!kTrackAllTaskObjects) return NULL; // Not compiled in. - if (!tracking_status()) + if (!TrackingStatus()) return NULL; ThreadData* current_thread_data = Get(); if (!current_thread_data) @@ -622,28 +622,31 @@ bool ThreadData::Initialize() { } // static -bool ThreadData::InitializeAndSetTrackingStatus(bool status) { +bool ThreadData::InitializeAndSetTrackingStatus(Status status) { + DCHECK_GE(status, DEACTIVATED); + DCHECK_LE(status, PROFILING_CHILDREN_ACTIVE); + if (!Initialize()) // No-op if already initialized. return false; // Not compiled in. - if (!status) { - status_ = DEACTIVATED; - } else { - if (kTrackParentChildLinks) - status_ = PROFILING_CHILDREN_ACTIVE; - else - status_ = PROFILING_ACTIVE; - } + if (!kTrackParentChildLinks && status > DEACTIVATED) + status = PROFILING_ACTIVE; + status_ = status; return true; } // static -bool ThreadData::tracking_status() { +ThreadData::Status ThreadData::status() { + return status_; +} + +// static +bool ThreadData::TrackingStatus() { return status_ > DEACTIVATED; } // static -bool ThreadData::tracking_parent_child_status() { +bool ThreadData::TrackingParentChildStatus() { return status_ >= PROFILING_CHILDREN_ACTIVE; } @@ -664,7 +667,7 @@ TrackedTime ThreadData::NowForEndOfRun() { // static TrackedTime ThreadData::Now() { - if (kTrackAllTaskObjects && tracking_status()) + if (kTrackAllTaskObjects && TrackingStatus()) return TrackedTime::Now(); return TrackedTime(); // Super fast when disabled, or not compiled. } @@ -686,7 +689,7 @@ void ThreadData::ShutdownSingleThreadedCleanup(bool leak) { // This is only called from test code, where we need to cleanup so that // additional tests can be run. // We must be single threaded... but be careful anyway. - if (!InitializeAndSetTrackingStatus(false)) + if (!InitializeAndSetTrackingStatus(DEACTIVATED)) return; ThreadData* thread_data_list; { diff --git a/base/tracked_objects.h b/base/tracked_objects.h index 9b7f111..c0674cc 100644 --- a/base/tracked_objects.h +++ b/base/tracked_objects.h @@ -442,15 +442,17 @@ class BASE_EXPORT ThreadData { // PROFILING_ACTIVE (i.e., it can't be set to a higher level than what is // compiled into the binary, and parent-child tracking at the // PROFILING_CHILDREN_ACTIVE level might not be compiled in). - static bool InitializeAndSetTrackingStatus(bool status); + static bool InitializeAndSetTrackingStatus(Status status); + + static Status status(); // Indicate if any sort of profiling is being done (i.e., we are more than // DEACTIVATED). - static bool tracking_status(); + static bool TrackingStatus(); // For testing only, indicate if the status of parent-child tracking is turned - // on. This is currently a compiled option, atop tracking_status(). - static bool tracking_parent_child_status(); + // on. This is currently a compiled option, atop TrackingStatus(). + static bool TrackingParentChildStatus(); // Special versions of Now() for getting times at start and end of a tracked // run. They are super fast when tracking is disabled, and have some internal diff --git a/base/tracked_objects_unittest.cc b/base/tracked_objects_unittest.cc index 68911bb..d57ddee 100644 --- a/base/tracked_objects_unittest.cc +++ b/base/tracked_objects_unittest.cc @@ -35,7 +35,8 @@ class TrackedObjectsTest : public testing::Test { TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { // Minimal test doesn't even create any tasks. - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. @@ -55,7 +56,8 @@ TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { ShutdownSingleThreadedCleanup(false); // Do it again, just to be sure we reset state completely. - ThreadData::InitializeAndSetTrackingStatus(true); + ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE); EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. data = ThreadData::Get(); EXPECT_TRUE(ThreadData::first()); // Now class was constructed. @@ -71,7 +73,8 @@ TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { } TEST_F(TrackedObjectsTest, TinyStartupShutdown) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Instigate tracking on a single tracked object, on our thread. @@ -113,7 +116,7 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) { EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. EXPECT_EQ(1u, death_map.size()); // 1 location. EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. - if (ThreadData::tracking_parent_child_status()) { + if (ThreadData::TrackingParentChildStatus()) { EXPECT_EQ(1u, parent_child_set.size()); // 1 child. EXPECT_EQ(parent_child_set.begin()->first, parent_child_set.begin()->second); @@ -126,9 +129,10 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) { } TEST_F(TrackedObjectsTest, ParentChildTest) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; - if (!ThreadData::tracking_parent_child_status()) + if (!ThreadData::TrackingParentChildStatus()) return; // Feature not compiled in. // Instigate tracking on a single tracked object, on our thread. @@ -211,7 +215,8 @@ TEST_F(TrackedObjectsTest, ParentChildTest) { } TEST_F(TrackedObjectsTest, DeathDataTest) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; scoped_ptr<DeathData> data(new DeathData()); @@ -270,7 +275,7 @@ TEST_F(TrackedObjectsTest, DeathDataTest) { TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueWorkerThread) { // Transition to Deactivated state before doing anything. - if (!ThreadData::InitializeAndSetTrackingStatus(false)) + if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) return; // We don't initialize system with a thread name, so we're viewed as a worker // thread. @@ -296,7 +301,7 @@ TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueWorkerThread) { TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueMainThread) { // Start in the deactivated state. - if (!ThreadData::InitializeAndSetTrackingStatus(false)) + if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) return; // Use a well named thread. @@ -323,7 +328,8 @@ TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueMainThread) { } TEST_F(TrackedObjectsTest, BirthOnlyToValueWorkerThread) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // We don't initialize system with a thread name, so we're viewed as a worker // thread. @@ -365,7 +371,8 @@ TEST_F(TrackedObjectsTest, BirthOnlyToValueWorkerThread) { } TEST_F(TrackedObjectsTest, BirthOnlyToValueMainThread) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Use a well named thread. @@ -409,7 +416,8 @@ TEST_F(TrackedObjectsTest, BirthOnlyToValueMainThread) { } TEST_F(TrackedObjectsTest, LifeCycleToValueMainThread) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Use a well named thread. @@ -470,7 +478,8 @@ TEST_F(TrackedObjectsTest, LifeCycleToValueMainThread) { // our tallied births are matched by tallied deaths (except for when the // task is still running, or is queued). TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToValueMainThread) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Use a well named thread. @@ -491,7 +500,8 @@ TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToValueMainThread) { pending_task.time_posted = kTimePosted; // Overwrite implied Now(). // Turn off tracking now that we have births. - EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus(false)); + EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( + ThreadData::DEACTIVATED)); const TrackedTime kStartOfRun = TrackedTime() + Duration::FromMilliseconds(5); @@ -532,7 +542,7 @@ TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToValueMainThread) { // We will deactivate tracking before starting a life cycle, and neither // the birth nor the death will be recorded. TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToValueMainThread) { - if (!ThreadData::InitializeAndSetTrackingStatus(false)) + if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) return; // Use a well named thread. @@ -571,7 +581,8 @@ TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToValueMainThread) { } TEST_F(TrackedObjectsTest, LifeCycleToValueWorkerThread) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Don't initialize thread, so that we appear as a worker thread. @@ -662,7 +673,8 @@ TEST_F(TrackedObjectsTest, LifeCycleToValueWorkerThread) { } TEST_F(TrackedObjectsTest, TwoLives) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Use a well named thread. @@ -727,7 +739,8 @@ TEST_F(TrackedObjectsTest, TwoLives) { } TEST_F(TrackedObjectsTest, DifferentLives) { - if (!ThreadData::InitializeAndSetTrackingStatus(true)) + if (!ThreadData::InitializeAndSetTrackingStatus( + ThreadData::PROFILING_CHILDREN_ACTIVE)) return; // Use a well named thread. |