| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/debug/activity_tracker.h" | 5 #include "base/debug/activity_tracker.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 snapshot.activity_stack[0].origin_address); | 197 snapshot.activity_stack[0].origin_address); |
| 198 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); | 198 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); |
| 199 | 199 |
| 200 tracker->PopActivity(id1); | 200 tracker->PopActivity(id1); |
| 201 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 201 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
| 202 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 202 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
| 203 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 203 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
| 204 } | 204 } |
| 205 | 205 |
| 206 TEST_F(ActivityTrackerTest, ScopedTaskTest) { | 206 TEST_F(ActivityTrackerTest, ScopedTaskTest) { |
| 207 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 207 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
| 208 | 208 |
| 209 ThreadActivityTracker* tracker = | 209 ThreadActivityTracker* tracker = |
| 210 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); | 210 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); |
| 211 ThreadActivityTracker::Snapshot snapshot; | 211 ThreadActivityTracker::Snapshot snapshot; |
| 212 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); | 212 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); |
| 213 | 213 |
| 214 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 214 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
| 215 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 215 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
| 216 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 216 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
| 217 | 217 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 244 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); | 244 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); |
| 245 } | 245 } |
| 246 | 246 |
| 247 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 247 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
| 248 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 248 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
| 249 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 249 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
| 250 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed()); | 250 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed()); |
| 251 } | 251 } |
| 252 | 252 |
| 253 TEST_F(ActivityTrackerTest, ExceptionTest) { | 253 TEST_F(ActivityTrackerTest, ExceptionTest) { |
| 254 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 254 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
| 255 GlobalActivityTracker* global = GlobalActivityTracker::Get(); | 255 GlobalActivityTracker* global = GlobalActivityTracker::Get(); |
| 256 | 256 |
| 257 ThreadActivityTracker* tracker = | 257 ThreadActivityTracker* tracker = |
| 258 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); | 258 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); |
| 259 ThreadActivityTracker::Snapshot snapshot; | 259 ThreadActivityTracker::Snapshot snapshot; |
| 260 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); | 260 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); |
| 261 | 261 |
| 262 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 262 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
| 263 ASSERT_EQ(0U, snapshot.last_exception.activity_type); | 263 ASSERT_EQ(0U, snapshot.last_exception.activity_type); |
| 264 | 264 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 294 global = GlobalActivityTracker::Get(); | 294 global = GlobalActivityTracker::Get(); |
| 295 EXPECT_EQ(std::string("bar"), global->allocator()->Name()); | 295 EXPECT_EQ(std::string("bar"), global->allocator()->Name()); |
| 296 global->ReleaseTrackerForCurrentThreadForTesting(); | 296 global->ReleaseTrackerForCurrentThreadForTesting(); |
| 297 delete global; | 297 delete global; |
| 298 } | 298 } |
| 299 | 299 |
| 300 | 300 |
| 301 // GlobalActivityTracker tests below. | 301 // GlobalActivityTracker tests below. |
| 302 | 302 |
| 303 TEST_F(ActivityTrackerTest, BasicTest) { | 303 TEST_F(ActivityTrackerTest, BasicTest) { |
| 304 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 304 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
| 305 GlobalActivityTracker* global = GlobalActivityTracker::Get(); | 305 GlobalActivityTracker* global = GlobalActivityTracker::Get(); |
| 306 | 306 |
| 307 // Ensure the data repositories have backing store, indicated by non-zero ID. | 307 // Ensure the data repositories have backing store, indicated by non-zero ID. |
| 308 EXPECT_NE(0U, global->process_data().id()); | 308 EXPECT_NE(0U, global->process_data().id()); |
| 309 EXPECT_NE(0U, global->global_data().id()); | 309 EXPECT_NE(0U, global->global_data().id()); |
| 310 EXPECT_NE(global->process_data().id(), global->global_data().id()); | 310 EXPECT_NE(global->process_data().id(), global->global_data().id()); |
| 311 } | 311 } |
| 312 | 312 |
| 313 class SimpleActivityThread : public SimpleThread { | 313 class SimpleActivityThread : public SimpleThread { |
| 314 public: | 314 public: |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 | 357 |
| 358 bool ready_ = false; | 358 bool ready_ = false; |
| 359 bool exit_ = false; | 359 bool exit_ = false; |
| 360 Lock lock_; | 360 Lock lock_; |
| 361 ConditionVariable exit_condition_; | 361 ConditionVariable exit_condition_; |
| 362 | 362 |
| 363 DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread); | 363 DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread); |
| 364 }; | 364 }; |
| 365 | 365 |
| 366 TEST_F(ActivityTrackerTest, ThreadDeathTest) { | 366 TEST_F(ActivityTrackerTest, ThreadDeathTest) { |
| 367 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 367 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
| 368 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); | 368 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); |
| 369 const size_t starting_active = GetGlobalActiveTrackerCount(); | 369 const size_t starting_active = GetGlobalActiveTrackerCount(); |
| 370 const size_t starting_inactive = GetGlobalInactiveTrackerCount(); | 370 const size_t starting_inactive = GetGlobalInactiveTrackerCount(); |
| 371 | 371 |
| 372 SimpleActivityThread t1("t1", nullptr, Activity::ACT_TASK, | 372 SimpleActivityThread t1("t1", nullptr, Activity::ACT_TASK, |
| 373 ActivityData::ForTask(11)); | 373 ActivityData::ForTask(11)); |
| 374 t1.Start(); | 374 t1.Start(); |
| 375 t1.WaitReady(); | 375 t1.WaitReady(); |
| 376 EXPECT_EQ(starting_active + 1, GetGlobalActiveTrackerCount()); | 376 EXPECT_EQ(starting_active + 1, GetGlobalActiveTrackerCount()); |
| 377 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount()); | 377 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 394 t2.Join(); | 394 t2.Join(); |
| 395 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount()); | 395 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount()); |
| 396 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount()); | 396 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount()); |
| 397 } | 397 } |
| 398 | 398 |
| 399 TEST_F(ActivityTrackerTest, ProcessDeathTest) { | 399 TEST_F(ActivityTrackerTest, ProcessDeathTest) { |
| 400 // This doesn't actually create and destroy a process. Instead, it uses for- | 400 // This doesn't actually create and destroy a process. Instead, it uses for- |
| 401 // testing interfaces to simulate data created by other processes. | 401 // testing interfaces to simulate data created by other processes. |
| 402 const ProcessId other_process_id = GetCurrentProcId() + 1; | 402 const ProcessId other_process_id = GetCurrentProcId() + 1; |
| 403 | 403 |
| 404 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 404 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
| 405 GlobalActivityTracker* global = GlobalActivityTracker::Get(); | 405 GlobalActivityTracker* global = GlobalActivityTracker::Get(); |
| 406 ThreadActivityTracker* thread = global->GetOrCreateTrackerForCurrentThread(); | 406 ThreadActivityTracker* thread = global->GetOrCreateTrackerForCurrentThread(); |
| 407 | 407 |
| 408 // Get callbacks for process exit. | 408 // Get callbacks for process exit. |
| 409 global->SetProcessExitCallback( | 409 global->SetProcessExitCallback( |
| 410 Bind(&ActivityTrackerTest::HandleProcessExit, Unretained(this))); | 410 Bind(&ActivityTrackerTest::HandleProcessExit, Unretained(this))); |
| 411 | 411 |
| 412 // Pretend than another process has started. | 412 // Pretend than another process has started. |
| 413 global->RecordProcessLaunch(other_process_id, FILE_PATH_LITERAL("foo --bar")); | 413 global->RecordProcessLaunch(other_process_id, FILE_PATH_LITERAL("foo --bar")); |
| 414 | 414 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 434 user_data.GetBaseAddress(), | 434 user_data.GetBaseAddress(), |
| 435 GlobalActivityTracker::kTypeIdUserDataRecord); | 435 GlobalActivityTracker::kTypeIdUserDataRecord); |
| 436 ASSERT_TRUE(user_data_ref); | 436 ASSERT_TRUE(user_data_ref); |
| 437 | 437 |
| 438 // Make a copy of the thread-tracker state so it can be restored later. | 438 // Make a copy of the thread-tracker state so it can be restored later. |
| 439 const size_t tracker_size = global->allocator()->GetAllocSize(tracker_ref); | 439 const size_t tracker_size = global->allocator()->GetAllocSize(tracker_ref); |
| 440 std::unique_ptr<char[]> tracker_copy(new char[tracker_size]); | 440 std::unique_ptr<char[]> tracker_copy(new char[tracker_size]); |
| 441 memcpy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size); | 441 memcpy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size); |
| 442 | 442 |
| 443 // Change the objects to appear to be owned by another process. | 443 // Change the objects to appear to be owned by another process. |
| 444 ProcessId owning_id; | 444 int64_t owning_id; |
| 445 int64_t stamp; | 445 int64_t stamp; |
| 446 ASSERT_TRUE(ActivityUserData::GetOwningProcessId( | 446 ASSERT_TRUE(ActivityUserData::GetOwningProcessId( |
| 447 global->process_data().GetBaseAddress(), &owning_id, &stamp)); | 447 global->process_data().GetBaseAddress(), &owning_id, &stamp)); |
| 448 EXPECT_NE(other_process_id, owning_id); | 448 EXPECT_NE(other_process_id, owning_id); |
| 449 ASSERT_TRUE(ThreadActivityTracker::GetOwningProcessId( | 449 ASSERT_TRUE(ThreadActivityTracker::GetOwningProcessId( |
| 450 thread->GetBaseAddress(), &owning_id, &stamp)); | 450 thread->GetBaseAddress(), &owning_id, &stamp)); |
| 451 EXPECT_NE(other_process_id, owning_id); | 451 EXPECT_NE(other_process_id, owning_id); |
| 452 ASSERT_TRUE(ActivityUserData::GetOwningProcessId(user_data.GetBaseAddress(), | 452 ASSERT_TRUE(ActivityUserData::GetOwningProcessId(user_data.GetBaseAddress(), |
| 453 &owning_id, &stamp)); | 453 &owning_id, &stamp)); |
| 454 EXPECT_NE(other_process_id, owning_id); | 454 EXPECT_NE(other_process_id, owning_id); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 global->allocator()->ChangeType( | 493 global->allocator()->ChangeType( |
| 494 tracker_ref, GlobalActivityTracker::kTypeIdActivityTracker, | 494 tracker_ref, GlobalActivityTracker::kTypeIdActivityTracker, |
| 495 GlobalActivityTracker::kTypeIdActivityTrackerFree, false); | 495 GlobalActivityTracker::kTypeIdActivityTrackerFree, false); |
| 496 global->allocator()->ChangeType( | 496 global->allocator()->ChangeType( |
| 497 user_data_ref, GlobalActivityTracker::kTypeIdUserDataRecord, | 497 user_data_ref, GlobalActivityTracker::kTypeIdUserDataRecord, |
| 498 GlobalActivityTracker::kTypeIdUserDataRecordFree, false); | 498 GlobalActivityTracker::kTypeIdUserDataRecordFree, false); |
| 499 } | 499 } |
| 500 | 500 |
| 501 } // namespace debug | 501 } // namespace debug |
| 502 } // namespace base | 502 } // namespace base |
| OLD | NEW |