OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/tracked_objects.h" | 5 #include "base/tracked_objects.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 | 8 |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 DCHECK_EQ(parent_stack_.top(), &birth); | 386 DCHECK_EQ(parent_stack_.top(), &birth); |
387 parent_stack_.pop(); | 387 parent_stack_.pop(); |
388 } | 388 } |
389 } | 389 } |
390 | 390 |
391 // static | 391 // static |
392 Births* ThreadData::TallyABirthIfActive(const Location& location) { | 392 Births* ThreadData::TallyABirthIfActive(const Location& location) { |
393 if (!kTrackAllTaskObjects) | 393 if (!kTrackAllTaskObjects) |
394 return NULL; // Not compiled in. | 394 return NULL; // Not compiled in. |
395 | 395 |
396 if (!tracking_status()) | 396 if (!TrackingStatus()) |
397 return NULL; | 397 return NULL; |
398 ThreadData* current_thread_data = Get(); | 398 ThreadData* current_thread_data = Get(); |
399 if (!current_thread_data) | 399 if (!current_thread_data) |
400 return NULL; | 400 return NULL; |
401 return current_thread_data->TallyABirth(location); | 401 return current_thread_data->TallyABirth(location); |
402 } | 402 } |
403 | 403 |
404 // static | 404 // static |
405 void ThreadData::TallyRunOnNamedThreadIfTracking( | 405 void ThreadData::TallyRunOnNamedThreadIfTracking( |
406 const base::TrackingInfo& completed_task, | 406 const base::TrackingInfo& completed_task, |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 // we get the lock earlier in this method. | 615 // we get the lock earlier in this method. |
616 status_ = kInitialStartupState; | 616 status_ = kInitialStartupState; |
617 if (!kTrackParentChildLinks && | 617 if (!kTrackParentChildLinks && |
618 kInitialStartupState == PROFILING_CHILDREN_ACTIVE) | 618 kInitialStartupState == PROFILING_CHILDREN_ACTIVE) |
619 status_ = PROFILING_ACTIVE; | 619 status_ = PROFILING_ACTIVE; |
620 DCHECK(status_ != UNINITIALIZED); | 620 DCHECK(status_ != UNINITIALIZED); |
621 return true; | 621 return true; |
622 } | 622 } |
623 | 623 |
624 // static | 624 // static |
625 bool ThreadData::InitializeAndSetTrackingStatus(bool status) { | 625 bool ThreadData::InitializeAndSetTrackingStatus(Status status) { |
| 626 DCHECK_GE(status, DEACTIVATED); |
| 627 DCHECK_LE(status, PROFILING_CHILDREN_ACTIVE); |
| 628 |
626 if (!Initialize()) // No-op if already initialized. | 629 if (!Initialize()) // No-op if already initialized. |
627 return false; // Not compiled in. | 630 return false; // Not compiled in. |
628 | 631 |
629 if (!status) { | 632 if (!kTrackParentChildLinks && status > DEACTIVATED) |
630 status_ = DEACTIVATED; | 633 status = PROFILING_ACTIVE; |
631 } else { | 634 status_ = status; |
632 if (kTrackParentChildLinks) | |
633 status_ = PROFILING_CHILDREN_ACTIVE; | |
634 else | |
635 status_ = PROFILING_ACTIVE; | |
636 } | |
637 return true; | 635 return true; |
638 } | 636 } |
639 | 637 |
640 // static | 638 // static |
641 bool ThreadData::tracking_status() { | 639 ThreadData::Status ThreadData::status() { |
| 640 return status_; |
| 641 } |
| 642 |
| 643 // static |
| 644 bool ThreadData::TrackingStatus() { |
642 return status_ > DEACTIVATED; | 645 return status_ > DEACTIVATED; |
643 } | 646 } |
644 | 647 |
645 // static | 648 // static |
646 bool ThreadData::tracking_parent_child_status() { | 649 bool ThreadData::TrackingParentChildStatus() { |
647 return status_ >= PROFILING_CHILDREN_ACTIVE; | 650 return status_ >= PROFILING_CHILDREN_ACTIVE; |
648 } | 651 } |
649 | 652 |
650 // static | 653 // static |
651 TrackedTime ThreadData::NowForStartOfRun(const Births* parent) { | 654 TrackedTime ThreadData::NowForStartOfRun(const Births* parent) { |
652 if (kTrackParentChildLinks && parent && status_ > PROFILING_ACTIVE) { | 655 if (kTrackParentChildLinks && parent && status_ > PROFILING_ACTIVE) { |
653 ThreadData* current_thread_data = Get(); | 656 ThreadData* current_thread_data = Get(); |
654 if (current_thread_data) | 657 if (current_thread_data) |
655 current_thread_data->parent_stack_.push(parent); | 658 current_thread_data->parent_stack_.push(parent); |
656 } | 659 } |
657 return Now(); | 660 return Now(); |
658 } | 661 } |
659 | 662 |
660 // static | 663 // static |
661 TrackedTime ThreadData::NowForEndOfRun() { | 664 TrackedTime ThreadData::NowForEndOfRun() { |
662 return Now(); | 665 return Now(); |
663 } | 666 } |
664 | 667 |
665 // static | 668 // static |
666 TrackedTime ThreadData::Now() { | 669 TrackedTime ThreadData::Now() { |
667 if (kTrackAllTaskObjects && tracking_status()) | 670 if (kTrackAllTaskObjects && TrackingStatus()) |
668 return TrackedTime::Now(); | 671 return TrackedTime::Now(); |
669 return TrackedTime(); // Super fast when disabled, or not compiled. | 672 return TrackedTime(); // Super fast when disabled, or not compiled. |
670 } | 673 } |
671 | 674 |
672 // static | 675 // static |
673 void ThreadData::EnsureCleanupWasCalled(int major_threads_shutdown_count) { | 676 void ThreadData::EnsureCleanupWasCalled(int major_threads_shutdown_count) { |
674 base::AutoLock lock(*list_lock_.Pointer()); | 677 base::AutoLock lock(*list_lock_.Pointer()); |
675 if (worker_thread_data_creation_count_ == 0) | 678 if (worker_thread_data_creation_count_ == 0) |
676 return; // We haven't really run much, and couldn't have leaked. | 679 return; // We haven't really run much, and couldn't have leaked. |
677 // Verify that we've at least shutdown/cleanup the major namesd threads. The | 680 // Verify that we've at least shutdown/cleanup the major namesd threads. The |
678 // caller should tell us how many thread shutdowns should have taken place by | 681 // caller should tell us how many thread shutdowns should have taken place by |
679 // now. | 682 // now. |
680 return; // TODO(jar): until this is working on XP, don't run the real test. | 683 return; // TODO(jar): until this is working on XP, don't run the real test. |
681 CHECK_GT(cleanup_count_, major_threads_shutdown_count); | 684 CHECK_GT(cleanup_count_, major_threads_shutdown_count); |
682 } | 685 } |
683 | 686 |
684 // static | 687 // static |
685 void ThreadData::ShutdownSingleThreadedCleanup(bool leak) { | 688 void ThreadData::ShutdownSingleThreadedCleanup(bool leak) { |
686 // This is only called from test code, where we need to cleanup so that | 689 // This is only called from test code, where we need to cleanup so that |
687 // additional tests can be run. | 690 // additional tests can be run. |
688 // We must be single threaded... but be careful anyway. | 691 // We must be single threaded... but be careful anyway. |
689 if (!InitializeAndSetTrackingStatus(false)) | 692 if (!InitializeAndSetTrackingStatus(DEACTIVATED)) |
690 return; | 693 return; |
691 ThreadData* thread_data_list; | 694 ThreadData* thread_data_list; |
692 { | 695 { |
693 base::AutoLock lock(*list_lock_.Pointer()); | 696 base::AutoLock lock(*list_lock_.Pointer()); |
694 thread_data_list = all_thread_data_list_head_; | 697 thread_data_list = all_thread_data_list_head_; |
695 all_thread_data_list_head_ = NULL; | 698 all_thread_data_list_head_ = NULL; |
696 ++incarnation_counter_; | 699 ++incarnation_counter_; |
697 // To be clean, break apart the retired worker list (though we leak them). | 700 // To be clean, break apart the retired worker list (though we leak them). |
698 while (first_retired_worker_) { | 701 while (first_retired_worker_) { |
699 ThreadData* worker = first_retired_worker_; | 702 ThreadData* worker = first_retired_worker_; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 ++it) { | 830 ++it) { |
828 base::DictionaryValue* parent_child = new base::DictionaryValue; | 831 base::DictionaryValue* parent_child = new base::DictionaryValue; |
829 it->first->ToValue("parent", parent_child); | 832 it->first->ToValue("parent", parent_child); |
830 it->second->ToValue("child", parent_child); | 833 it->second->ToValue("child", parent_child); |
831 descendants->Append(parent_child); | 834 descendants->Append(parent_child); |
832 } | 835 } |
833 dictionary->Set("descendants", descendants); | 836 dictionary->Set("descendants", descendants); |
834 } | 837 } |
835 | 838 |
836 } // namespace tracked_objects | 839 } // namespace tracked_objects |
OLD | NEW |