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 <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <stack> | 10 #include <stack> |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 233 |
234 class BASE_EXPORT Births: public BirthOnThread { | 234 class BASE_EXPORT Births: public BirthOnThread { |
235 public: | 235 public: |
236 Births(const Location& location, const ThreadData& current); | 236 Births(const Location& location, const ThreadData& current); |
237 | 237 |
238 int birth_count() const; | 238 int birth_count() const; |
239 | 239 |
240 // When we have a birth we update the count for this birthplace. | 240 // When we have a birth we update the count for this birthplace. |
241 void RecordBirth(); | 241 void RecordBirth(); |
242 | 242 |
243 // When a birthplace is changed (updated), we need to decrement the counter | |
244 // for the old instance. | |
245 void ForgetBirth(); | |
246 | |
247 // Hack to quickly reset all counts to zero. | |
248 void Clear(); | |
249 | |
250 private: | 243 private: |
251 // The number of births on this thread for our location_. | 244 // The number of births on this thread for our location_. |
252 int birth_count_; | 245 int birth_count_; |
253 | 246 |
254 DISALLOW_COPY_AND_ASSIGN(Births); | 247 DISALLOW_COPY_AND_ASSIGN(Births); |
255 }; | 248 }; |
256 | 249 |
257 //------------------------------------------------------------------------------ | 250 //------------------------------------------------------------------------------ |
258 // Basic info summarizing multiple destructions of a tracked object with a | 251 // Basic info summarizing multiple destructions of a tracked object with a |
259 // single birthplace (fixed Location). Used both on specific threads, and also | 252 // single birthplace (fixed Location). Used both on specific threads, and also |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 const TaskStopwatch& stopwatch); | 408 const TaskStopwatch& stopwatch); |
416 | 409 |
417 // Record the end of execution in region, generally corresponding to a scope | 410 // Record the end of execution in region, generally corresponding to a scope |
418 // being exited. | 411 // being exited. |
419 static void TallyRunInAScopedRegionIfTracking( | 412 static void TallyRunInAScopedRegionIfTracking( |
420 const Births* birth, | 413 const Births* birth, |
421 const TaskStopwatch& stopwatch); | 414 const TaskStopwatch& stopwatch); |
422 | 415 |
423 const std::string& thread_name() const { return thread_name_; } | 416 const std::string& thread_name() const { return thread_name_; } |
424 | 417 |
425 // Hack: asynchronously clear all birth counts and death tallies data values | |
426 // in all ThreadData instances. The numerical (zeroing) part is done without | |
427 // use of a locks or atomics exchanges, and may (for int64 values) produce | |
428 // bogus counts VERY rarely. | |
429 static void ResetAllThreadData(); | |
430 | |
431 // Initializes all statics if needed (this initialization call should be made | 418 // Initializes all statics if needed (this initialization call should be made |
432 // while we are single threaded). Returns false if unable to initialize. | 419 // while we are single threaded). Returns false if unable to initialize. |
433 static bool Initialize(); | 420 static bool Initialize(); |
434 | 421 |
435 // Sets internal status_. | 422 // Sets internal status_. |
436 // If |status| is false, then status_ is set to DEACTIVATED. | 423 // If |status| is false, then status_ is set to DEACTIVATED. |
437 // If |status| is true, then status_ is set to, PROFILING_ACTIVE, or | 424 // If |status| is true, then status_ is set to, PROFILING_ACTIVE, or |
438 // PROFILING_CHILDREN_ACTIVE. | 425 // PROFILING_CHILDREN_ACTIVE. |
439 // If tracking is not compiled in, this function will return false. | 426 // If tracking is not compiled in, this function will return false. |
440 // If parent-child tracking is not compiled in, then an attempt to set the | 427 // If parent-child tracking is not compiled in, then an attempt to set the |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 void SnapshotExecutedTasks(ProcessDataSnapshot* process_data, | 525 void SnapshotExecutedTasks(ProcessDataSnapshot* process_data, |
539 BirthCountMap* birth_counts); | 526 BirthCountMap* birth_counts); |
540 | 527 |
541 // Using our lock, make a copy of the specified maps. This call may be made | 528 // Using our lock, make a copy of the specified maps. This call may be made |
542 // on non-local threads, which necessitate the use of the lock to prevent | 529 // on non-local threads, which necessitate the use of the lock to prevent |
543 // the map(s) from being reallocated while they are copied. | 530 // the map(s) from being reallocated while they are copied. |
544 void SnapshotMaps(BirthMap* birth_map, | 531 void SnapshotMaps(BirthMap* birth_map, |
545 DeathMap* death_map, | 532 DeathMap* death_map, |
546 ParentChildSet* parent_child_set); | 533 ParentChildSet* parent_child_set); |
547 | 534 |
548 // Using our lock to protect the iteration, Clear all birth and death data. | |
549 void Reset(); | |
550 | |
551 // This method is called by the TLS system when a thread terminates. | 535 // This method is called by the TLS system when a thread terminates. |
552 // The argument may be NULL if this thread has never tracked a birth or death. | 536 // The argument may be NULL if this thread has never tracked a birth or death. |
553 static void OnThreadTermination(void* thread_data); | 537 static void OnThreadTermination(void* thread_data); |
554 | 538 |
555 // This method should be called when a worker thread terminates, so that we | 539 // This method should be called when a worker thread terminates, so that we |
556 // can save all the thread data into a cache of reusable ThreadData instances. | 540 // can save all the thread data into a cache of reusable ThreadData instances. |
557 void OnThreadTerminationCleanup(); | 541 void OnThreadTerminationCleanup(); |
558 | 542 |
559 // Cleans up data structures, and returns statics to near pristine (mostly | 543 // Cleans up data structures, and returns statics to near pristine (mostly |
560 // uninitialized) state. If there is any chance that other threads are still | 544 // uninitialized) state. If there is any chance that other threads are still |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 ~ProcessDataSnapshot(); | 754 ~ProcessDataSnapshot(); |
771 | 755 |
772 std::vector<TaskSnapshot> tasks; | 756 std::vector<TaskSnapshot> tasks; |
773 std::vector<ParentChildPairSnapshot> descendants; | 757 std::vector<ParentChildPairSnapshot> descendants; |
774 int process_id; | 758 int process_id; |
775 }; | 759 }; |
776 | 760 |
777 } // namespace tracked_objects | 761 } // namespace tracked_objects |
778 | 762 |
779 #endif // BASE_TRACKED_OBJECTS_H_ | 763 #endif // BASE_TRACKED_OBJECTS_H_ |
OLD | NEW |