summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 19:43:42 +0000
committerjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 19:43:42 +0000
commit702a12dae9a2ed34362e381df7419c314e4124bf (patch)
treec9980ba18234d26584d03629600e06996744e7ce /base
parentc07eef4e772952ab4ad0213b581c97e92f00831e (diff)
downloadchromium_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.cc7
-rw-r--r--base/tracked_objects.cc31
-rw-r--r--base/tracked_objects.h10
-rw-r--r--base/tracked_objects_unittest.cc49
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.