| 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 #ifndef BASE_TRACKED_OBJECTS_H_ | 5 #ifndef BASE_TRACKED_OBJECTS_H_ |
| 6 #define BASE_TRACKED_OBJECTS_H_ | 6 #define BASE_TRACKED_OBJECTS_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| 11 #include <set> | 11 #include <set> |
| 12 #include <stack> | 12 #include <stack> |
| 13 #include <string> | 13 #include <string> |
| 14 #include <utility> | 14 #include <utility> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "base/allocator/features.h" | 17 #include "base/allocator/features.h" |
| 18 #include "base/atomicops.h" | 18 #include "base/atomicops.h" |
| 19 #include "base/base_export.h" | 19 #include "base/base_export.h" |
| 20 #include "base/containers/hash_tables.h" | 20 #include "base/containers/hash_tables.h" |
| 21 #include "base/debug/debugging_flags.h" | 21 #include "base/debug/debugging_flags.h" |
| 22 #include "base/debug/thread_heap_usage_tracker.h" | 22 #include "base/debug/thread_heap_usage_tracker.h" |
| 23 #include "base/gtest_prod_util.h" | 23 #include "base/gtest_prod_util.h" |
| 24 #include "base/lazy_instance.h" | |
| 25 #include "base/location.h" | 24 #include "base/location.h" |
| 26 #include "base/macros.h" | 25 #include "base/macros.h" |
| 27 #include "base/process/process_handle.h" | 26 #include "base/process/process_handle.h" |
| 28 #include "base/profiler/tracked_time.h" | 27 #include "base/profiler/tracked_time.h" |
| 29 #include "base/synchronization/lock.h" | 28 #include "base/synchronization/lock.h" |
| 30 #include "base/threading/thread_checker.h" | 29 #include "base/threading/thread_checker.h" |
| 31 #include "base/threading/thread_local_storage.h" | 30 #include "base/threading/thread_local_storage.h" |
| 32 | 31 |
| 33 namespace base { | 32 namespace base { |
| 34 struct TrackingInfo; | 33 struct TrackingInfo; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // name without trailing digits) as the current thread is available, it is | 118 // name without trailing digits) as the current thread is available, it is |
| 120 // reused. Otherwise, a new ThreadData instance is instantiated. Since a | 119 // reused. Otherwise, a new ThreadData instance is instantiated. Since a |
| 121 // ThreadData is bound to at most one thread at a time, there is no need to | 120 // ThreadData is bound to at most one thread at a time, there is no need to |
| 122 // acquire a lock to access its maps. Over time, a ThreadData may be bound to | 121 // acquire a lock to access its maps. Over time, a ThreadData may be bound to |
| 123 // different threads that share the same sanitized name. | 122 // different threads that share the same sanitized name. |
| 124 // | 123 // |
| 125 // We maintain a list of all ThreadData instances for the current process. Each | 124 // We maintain a list of all ThreadData instances for the current process. Each |
| 126 // ThreadData instance has a pointer to the next one. A static member of | 125 // ThreadData instance has a pointer to the next one. A static member of |
| 127 // ThreadData provides a pointer to the first item on this global list, and | 126 // ThreadData provides a pointer to the first item on this global list, and |
| 128 // access via that all_thread_data_list_head_ item requires the use of the | 127 // access via that all_thread_data_list_head_ item requires the use of the |
| 129 // list_lock_. | 128 // ListLock(). |
| 130 // | 129 // |
| 131 // When new ThreadData instances are added to the global list, they are pre- | 130 // When new ThreadData instances are added to the global list, they are pre- |
| 132 // pended, which ensures that any prior acquisition of the list is valid (i.e., | 131 // pended, which ensures that any prior acquisition of the list is valid (i.e., |
| 133 // the holder can iterate over it without fear of it changing, or the necessity | 132 // the holder can iterate over it without fear of it changing, or the necessity |
| 134 // of using an additional lock. Iterations are actually pretty rare (used | 133 // of using an additional lock. Iterations are actually pretty rare (used |
| 135 // primarily for cleanup, or snapshotting data for display), so this lock has | 134 // primarily for cleanup, or snapshotting data for display), so this lock has |
| 136 // very little global performance impact. | 135 // very little global performance impact. |
| 137 // | 136 // |
| 138 // The above description tries to define the high performance (run time) | 137 // The above description tries to define the high performance (run time) |
| 139 // portions of these classes. After gathering statistics, calls instigated | 138 // portions of these classes. After gathering statistics, calls instigated |
| (...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 | 708 |
| 710 // When non-null, this specifies an external function that supplies monotone | 709 // When non-null, this specifies an external function that supplies monotone |
| 711 // increasing time functcion. | 710 // increasing time functcion. |
| 712 static NowFunction* now_function_for_testing_; | 711 static NowFunction* now_function_for_testing_; |
| 713 | 712 |
| 714 // We use thread local store to identify which ThreadData to interact with. | 713 // We use thread local store to identify which ThreadData to interact with. |
| 715 static base::ThreadLocalStorage::StaticSlot tls_index_; | 714 static base::ThreadLocalStorage::StaticSlot tls_index_; |
| 716 | 715 |
| 717 // Linked list of ThreadData instances that were associated with threads that | 716 // Linked list of ThreadData instances that were associated with threads that |
| 718 // have been terminated and that have not been associated with a new thread | 717 // have been terminated and that have not been associated with a new thread |
| 719 // since then. This is only accessed while |list_lock_| is held. | 718 // since then. This is only accessed while |ListLock()| is held. |
| 720 static ThreadData* first_retired_thread_data_; | 719 static ThreadData* first_retired_thread_data_; |
| 721 | 720 |
| 722 // Link to the most recently created instance (starts a null terminated list). | 721 // Link to the most recently created instance (starts a null terminated list). |
| 723 // The list is traversed by about:profiler when it needs to snapshot data. | 722 // The list is traversed by about:profiler when it needs to snapshot data. |
| 724 // This is only accessed while list_lock_ is held. | 723 // This is only accessed while ListLock() is held. |
| 725 static ThreadData* all_thread_data_list_head_; | 724 static ThreadData* all_thread_data_list_head_; |
| 726 | 725 |
| 727 // The number of times TLS has called us back to cleanup a ThreadData | 726 // The number of times TLS has called us back to cleanup a ThreadData |
| 728 // instance. This is only accessed while list_lock_ is held. | 727 // instance. This is only accessed while ListLock() is held. |
| 729 static int cleanup_count_; | 728 static int cleanup_count_; |
| 730 | 729 |
| 731 // Incarnation sequence number, indicating how many times (during unittests) | 730 // Incarnation sequence number, indicating how many times (during unittests) |
| 732 // we've either transitioned out of UNINITIALIZED, or into that state. This | 731 // we've either transitioned out of UNINITIALIZED, or into that state. This |
| 733 // value is only accessed while the list_lock_ is held. | 732 // value is only accessed while the ListLock() is held. |
| 734 static int incarnation_counter_; | 733 static int incarnation_counter_; |
| 735 | 734 |
| 736 // Protection for access to all_thread_data_list_head_, and to | 735 // Protection for access to all_thread_data_list_head_, and to |
| 737 // unregistered_thread_data_pool_. This lock is leaked at shutdown. | 736 // unregistered_thread_data_pool_. This lock is leaked at shutdown. |
| 738 // The lock is very infrequently used, so we can afford to just make a lazy | 737 // The lock is very infrequently used, so we can afford to just make a lazy |
| 739 // instance and be safe. | 738 // instance and be safe. |
| 740 static base::LazyInstance<base::Lock>::Leaky list_lock_; | 739 static base::Lock* ListLock() { |
| 740 static auto lock = new base::Lock(); |
| 741 return lock; |
| 742 } |
| 741 | 743 |
| 742 // We set status_ to SHUTDOWN when we shut down the tracking service. | 744 // We set status_ to SHUTDOWN when we shut down the tracking service. |
| 743 static base::subtle::Atomic32 status_; | 745 static base::subtle::Atomic32 status_; |
| 744 | 746 |
| 745 // Link to next instance (null terminated list). Used to globally track all | 747 // Link to next instance (null terminated list). Used to globally track all |
| 746 // registered instances (corresponds to all registered threads where we keep | 748 // registered instances (corresponds to all registered threads where we keep |
| 747 // data). Only modified in the constructor. | 749 // data). Only modified in the constructor. |
| 748 ThreadData* next_; | 750 ThreadData* next_; |
| 749 | 751 |
| 750 // Pointer to another retired ThreadData instance. This value is nullptr if | 752 // Pointer to another retired ThreadData instance. This value is nullptr if |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 ProcessDataSnapshot(const ProcessDataSnapshot& other); | 891 ProcessDataSnapshot(const ProcessDataSnapshot& other); |
| 890 ~ProcessDataSnapshot(); | 892 ~ProcessDataSnapshot(); |
| 891 | 893 |
| 892 PhasedProcessDataSnapshotMap phased_snapshots; | 894 PhasedProcessDataSnapshotMap phased_snapshots; |
| 893 base::ProcessId process_id; | 895 base::ProcessId process_id; |
| 894 }; | 896 }; |
| 895 | 897 |
| 896 } // namespace tracked_objects | 898 } // namespace tracked_objects |
| 897 | 899 |
| 898 #endif // BASE_TRACKED_OBJECTS_H_ | 900 #endif // BASE_TRACKED_OBJECTS_H_ |
| OLD | NEW |