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

Unified Diff: base/tracked_objects_unittest.cc

Issue 2488073002: Reuse ThreadData instances associated with terminated named threads. (Closed)
Patch Set: rebase Created 4 years 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 | « base/tracked_objects.cc ('k') | chrome/browser/task_profiler/task_profiler_data_serializer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/tracked_objects_unittest.cc
diff --git a/base/tracked_objects_unittest.cc b/base/tracked_objects_unittest.cc
index b64e5fdd4e235868a8ad090175e105ab72a9e619..f208e3c9818fca3f5d1d54ea298471c883c64091 100644
--- a/base/tracked_objects_unittest.cc
+++ b/base/tracked_objects_unittest.cc
@@ -11,14 +11,17 @@
#include <memory>
+#include "base/macros.h"
#include "base/process/process_handle.h"
+#include "base/strings/stringprintf.h"
+#include "base/threading/thread.h"
#include "base/time/time.h"
#include "base/tracking_info.h"
#include "testing/gtest/include/gtest/gtest.h"
const int kLineNumber = 1776;
const char kFile[] = "FixedUnitTestFileName";
-const char kWorkerThreadName[] = "WorkerThread-1";
+const char kWorkerThreadName[] = "WorkerThread-*";
const char kMainThreadName[] = "SomeMainThreadName";
const char kStillAlive[] = "Still_Alive";
@@ -92,7 +95,8 @@ class TrackedObjectsTest : public testing::Test {
EXPECT_EQ(kLineNumber,
process_data_phase.tasks[0].birth.location.line_number);
- EXPECT_EQ(birth_thread, process_data_phase.tasks[0].birth.thread_name);
+ EXPECT_EQ(birth_thread,
+ process_data_phase.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(count, process_data_phase.tasks[0].death_data.count);
EXPECT_EQ(count * run_ms,
@@ -107,7 +111,8 @@ class TrackedObjectsTest : public testing::Test {
EXPECT_EQ(queue_ms,
process_data_phase.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(death_thread, process_data_phase.tasks[0].death_thread_name);
+ EXPECT_EQ(death_thread,
+ process_data_phase.tasks[0].death_sanitized_thread_name);
EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
}
@@ -115,6 +120,16 @@ class TrackedObjectsTest : public testing::Test {
// Sets time that will be returned by ThreadData::Now().
static void SetTestTime(unsigned int test_time) { test_time_ = test_time; }
+ int GetNumThreadData() {
+ int num_thread_data = 0;
+ ThreadData* current = ThreadData::first();
+ while (current) {
+ ++num_thread_data;
+ current = current->next();
+ }
+ return num_thread_data;
+ }
+
private:
// Returns test time in milliseconds.
static unsigned int GetTestTime() { return test_time_; }
@@ -230,7 +245,8 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) {
process_data_phase.tasks[0].birth.location.function_name);
EXPECT_EQ(kLineNumber,
process_data_phase.tasks[0].birth.location.line_number);
- EXPECT_EQ(kWorkerThreadName, process_data_phase.tasks[0].birth.thread_name);
+ EXPECT_EQ(kWorkerThreadName,
+ process_data_phase.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase.tasks[0].death_data.count);
EXPECT_EQ(time_elapsed,
process_data_phase.tasks[0].death_data.run_duration_sum);
@@ -241,7 +257,8 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) {
EXPECT_EQ(0, process_data_phase.tasks[0].death_data.queue_duration_sum);
EXPECT_EQ(0, process_data_phase.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(0, process_data_phase.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kWorkerThreadName, process_data_phase.tasks[0].death_thread_name);
+ EXPECT_EQ(kWorkerThreadName,
+ process_data_phase.tasks[0].death_sanitized_thread_name);
}
TEST_F(TrackedObjectsTest, DeathDataTestRecordDurations) {
@@ -659,7 +676,8 @@ TEST_F(TrackedObjectsTest, TwoPhases) {
EXPECT_EQ(kLineNumber,
process_data_phase0.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase0.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count);
EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sum);
@@ -669,7 +687,8 @@ TEST_F(TrackedObjectsTest, TwoPhases) {
EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase0.tasks[0].death_sanitized_thread_name);
auto it1 = process_data.phased_snapshots.find(1);
ASSERT_TRUE(it1 != process_data.phased_snapshots.end());
@@ -683,7 +702,8 @@ TEST_F(TrackedObjectsTest, TwoPhases) {
EXPECT_EQ(kLineNumber,
process_data_phase1.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase1.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count);
EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_sum);
@@ -693,7 +713,8 @@ TEST_F(TrackedObjectsTest, TwoPhases) {
EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase1.tasks[0].death_sanitized_thread_name);
EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
}
@@ -776,7 +797,8 @@ TEST_F(TrackedObjectsTest, ThreePhases) {
EXPECT_EQ(kLineNumber,
process_data_phase0.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase0.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count);
EXPECT_EQ(6, process_data_phase0.tasks[0].death_data.run_duration_sum);
@@ -786,7 +808,8 @@ TEST_F(TrackedObjectsTest, ThreePhases) {
EXPECT_EQ(7, process_data_phase0.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(7, process_data_phase0.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase0.tasks[0].death_sanitized_thread_name);
auto it1 = process_data.phased_snapshots.find(1);
ASSERT_TRUE(it1 != process_data.phased_snapshots.end());
@@ -800,7 +823,8 @@ TEST_F(TrackedObjectsTest, ThreePhases) {
EXPECT_EQ(kLineNumber,
process_data_phase1.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase1.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count);
EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.run_duration_sum);
@@ -810,7 +834,8 @@ TEST_F(TrackedObjectsTest, ThreePhases) {
EXPECT_EQ(5, process_data_phase1.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(5, process_data_phase1.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase1.tasks[0].death_sanitized_thread_name);
auto it2 = process_data.phased_snapshots.find(2);
ASSERT_TRUE(it2 != process_data.phased_snapshots.end());
@@ -824,7 +849,8 @@ TEST_F(TrackedObjectsTest, ThreePhases) {
EXPECT_EQ(kLineNumber,
process_data_phase2.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase2.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase2.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase2.tasks[0].death_data.count);
EXPECT_EQ(2, process_data_phase2.tasks[0].death_data.run_duration_sum);
@@ -834,7 +860,8 @@ TEST_F(TrackedObjectsTest, ThreePhases) {
EXPECT_EQ(3, process_data_phase2.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(3, process_data_phase2.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase2.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase2.tasks[0].death_sanitized_thread_name);
EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
}
@@ -881,7 +908,8 @@ TEST_F(TrackedObjectsTest, TwoPhasesSecondEmpty) {
EXPECT_EQ(kLineNumber,
process_data_phase0.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase0.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count);
EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sum);
@@ -891,7 +919,8 @@ TEST_F(TrackedObjectsTest, TwoPhasesSecondEmpty) {
EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase0.tasks[0].death_sanitized_thread_name);
auto it1 = process_data.phased_snapshots.find(1);
ASSERT_TRUE(it1 != process_data.phased_snapshots.end());
@@ -944,7 +973,8 @@ TEST_F(TrackedObjectsTest, TwoPhasesFirstEmpty) {
EXPECT_EQ(kLineNumber,
process_data_phase1.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase1.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count);
EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.run_duration_sum);
@@ -954,7 +984,8 @@ TEST_F(TrackedObjectsTest, TwoPhasesFirstEmpty) {
EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase1.tasks[0].death_sanitized_thread_name);
EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
}
@@ -1121,7 +1152,8 @@ TEST_F(TrackedObjectsTest, DifferentLives) {
process_data_phase.tasks[0].birth.location.function_name);
EXPECT_EQ(kLineNumber,
process_data_phase.tasks[0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase.tasks[0].death_data.count);
EXPECT_EQ(2, process_data_phase.tasks[0].death_data.run_duration_sum);
EXPECT_EQ(2, process_data_phase.tasks[0].death_data.run_duration_max);
@@ -1129,13 +1161,15 @@ TEST_F(TrackedObjectsTest, DifferentLives) {
EXPECT_EQ(4, process_data_phase.tasks[0].death_data.queue_duration_sum);
EXPECT_EQ(4, process_data_phase.tasks[0].death_data.queue_duration_max);
EXPECT_EQ(4, process_data_phase.tasks[0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[0].death_sanitized_thread_name);
EXPECT_EQ(kFile, process_data_phase.tasks[1].birth.location.file_name);
EXPECT_EQ(kFunction,
process_data_phase.tasks[1].birth.location.function_name);
EXPECT_EQ(kSecondFakeLineNumber,
process_data_phase.tasks[1].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[1].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[1].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase.tasks[1].death_data.count);
EXPECT_EQ(0, process_data_phase.tasks[1].death_data.run_duration_sum);
EXPECT_EQ(0, process_data_phase.tasks[1].death_data.run_duration_max);
@@ -1143,7 +1177,8 @@ TEST_F(TrackedObjectsTest, DifferentLives) {
EXPECT_EQ(0, process_data_phase.tasks[1].death_data.queue_duration_sum);
EXPECT_EQ(0, process_data_phase.tasks[1].death_data.queue_duration_max);
EXPECT_EQ(0, process_data_phase.tasks[1].death_data.queue_duration_sample);
- EXPECT_EQ(kStillAlive, process_data_phase.tasks[1].death_thread_name);
+ EXPECT_EQ(kStillAlive,
+ process_data_phase.tasks[1].death_sanitized_thread_name);
EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
}
@@ -1286,7 +1321,8 @@ TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) {
process_data_phase.tasks[t0].birth.location.function_name);
EXPECT_EQ(kLineNumber,
process_data_phase.tasks[t0].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t0].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[t0].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase.tasks[t0].death_data.count);
EXPECT_EQ(6, process_data_phase.tasks[t0].death_data.run_duration_sum);
EXPECT_EQ(6, process_data_phase.tasks[t0].death_data.run_duration_max);
@@ -1294,13 +1330,15 @@ TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) {
EXPECT_EQ(4, process_data_phase.tasks[t0].death_data.queue_duration_sum);
EXPECT_EQ(4, process_data_phase.tasks[t0].death_data.queue_duration_max);
EXPECT_EQ(4, process_data_phase.tasks[t0].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t0].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[t0].death_sanitized_thread_name);
EXPECT_EQ(kFile, process_data_phase.tasks[t1].birth.location.file_name);
EXPECT_EQ(kFunction,
process_data_phase.tasks[t1].birth.location.function_name);
EXPECT_EQ(kSecondFakeLineNumber,
process_data_phase.tasks[t1].birth.location.line_number);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t1].birth.thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[t1].birth.sanitized_thread_name);
EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.count);
EXPECT_EQ(2, process_data_phase.tasks[t1].death_data.run_duration_sum);
EXPECT_EQ(2, process_data_phase.tasks[t1].death_data.run_duration_max);
@@ -1308,8 +1346,30 @@ TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) {
EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.queue_duration_sum);
EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.queue_duration_max);
EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.queue_duration_sample);
- EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t1].death_thread_name);
+ EXPECT_EQ(kMainThreadName,
+ process_data_phase.tasks[t1].death_sanitized_thread_name);
EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
}
+// Repetitively create and stop named threads. Verify that the number of
+// instantiated ThreadData instance is equal to the number of different
+// sanitized thread names used in the test.
+TEST_F(TrackedObjectsTest, ReuseRetiredThreadData) {
+ const char* const kThreadNames[] = {"Foo%d", "Bar%d", "123Dummy%d",
+ "456Dummy%d", "%d"};
+ constexpr int kNumIterations = 10;
+ EXPECT_EQ(0, GetNumThreadData());
+
+ for (int i = 0; i < kNumIterations; ++i) {
+ for (const char* thread_name : kThreadNames) {
+ base::Thread thread(base::StringPrintf(thread_name, i));
+ EXPECT_TRUE(thread.Start());
+ }
+ }
+
+ // Expect one ThreadData instance for each element in |kThreadNames| and one
+ // ThreadData instance for the main thread.
+ EXPECT_EQ(static_cast<int>(arraysize(kThreadNames) + 1), GetNumThreadData());
+}
+
} // namespace tracked_objects
« no previous file with comments | « base/tracked_objects.cc ('k') | chrome/browser/task_profiler/task_profiler_data_serializer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698