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 |