Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1196)

Side by Side Diff: base/tracked_objects.h

Issue 8567007: Use leaky lazy instance for master lock in profiler (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | base/tracked_objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #pragma once 7 #pragma once
8 8
9 #include <map> 9 #include <map>
10 #include <stack> 10 #include <stack>
11 #include <string> 11 #include <string>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/base_export.h" 14 #include "base/base_export.h"
15 #include "base/lazy_instance.h"
15 #include "base/location.h" 16 #include "base/location.h"
16 #include "base/profiler/tracked_time.h" 17 #include "base/profiler/tracked_time.h"
17 #include "base/time.h" 18 #include "base/time.h"
18 #include "base/synchronization/lock.h" 19 #include "base/synchronization/lock.h"
19 #include "base/threading/thread_local_storage.h" 20 #include "base/threading/thread_local_storage.h"
20 #include "base/tracking_info.h" 21 #include "base/tracking_info.h"
21 #include "base/values.h" 22 #include "base/values.h"
22 23
23 // TrackedObjects provides a database of stats about objects (generally Tasks) 24 // TrackedObjects provides a database of stats about objects (generally Tasks)
24 // that are tracked. Tracking means their birth, death, duration, birth thread, 25 // that are tracked. Tracking means their birth, death, duration, birth thread,
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 std::map<const ThreadData*, int> birth_threads_; 426 std::map<const ThreadData*, int> birth_threads_;
426 DeathData death_data_; 427 DeathData death_data_;
427 std::map<const ThreadData*, int> death_threads_; 428 std::map<const ThreadData*, int> death_threads_;
428 429
429 DISALLOW_COPY_AND_ASSIGN(Aggregation); 430 DISALLOW_COPY_AND_ASSIGN(Aggregation);
430 }; 431 };
431 432
432 //------------------------------------------------------------------------------ 433 //------------------------------------------------------------------------------
433 // Comparator is a class that supports the comparison of Snapshot instances. 434 // Comparator is a class that supports the comparison of Snapshot instances.
434 // An instance is actually a list of chained Comparitors, that can provide for 435 // An instance is actually a list of chained Comparitors, that can provide for
435 // arbitrary ordering. The path portion of an about:tracking URL is translated 436 // arbitrary ordering. The path portion of an about:profiler URL is translated
436 // into such a chain, which is then used to order Snapshot instances in a 437 // into such a chain, which is then used to order Snapshot instances in a
437 // vector. It orders them into groups (for aggregation), and can also order 438 // vector. It orders them into groups (for aggregation), and can also order
438 // instances within the groups (for detailed rendering of the instances in an 439 // instances within the groups (for detailed rendering of the instances in an
439 // aggregation). 440 // aggregation).
440 441
441 class BASE_EXPORT Comparator { 442 class BASE_EXPORT Comparator {
442 public: 443 public:
443 // Selector enum is the token identifier for each parsed keyword, most of 444 // Selector enum is the token identifier for each parsed keyword, most of
444 // which specify a sort order. 445 // which specify a sort order.
445 // Since it is not meaningful to sort more than once on a specific key, we 446 // Since it is not meaningful to sort more than once on a specific key, we
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 // set *before* any births on the threads have taken place. It is generally 569 // set *before* any births on the threads have taken place. It is generally
569 // only used by the message loop, which has a well defined thread name. 570 // only used by the message loop, which has a well defined thread name.
570 static void InitializeThreadContext(const std::string& suggested_name); 571 static void InitializeThreadContext(const std::string& suggested_name);
571 572
572 // Using Thread Local Store, find the current instance for collecting data. 573 // Using Thread Local Store, find the current instance for collecting data.
573 // If an instance does not exist, construct one (and remember it for use on 574 // If an instance does not exist, construct one (and remember it for use on
574 // this thread. 575 // this thread.
575 // This may return NULL if the system is disabled for any reason. 576 // This may return NULL if the system is disabled for any reason.
576 static ThreadData* Get(); 577 static ThreadData* Get();
577 578
578 // For a given (unescaped) about:tracking query, develop resulting HTML, and 579 // For a given (unescaped) about:profiler query, develop resulting HTML, and
579 // append to output. 580 // append to output.
580 static void WriteHTML(const std::string& query, std::string* output); 581 static void WriteHTML(const std::string& query, std::string* output);
581 582
582 // For a given accumulated array of results, use the comparator to sort and 583 // For a given accumulated array of results, use the comparator to sort and
583 // subtotal, writing the results to the output. 584 // subtotal, writing the results to the output.
584 static void WriteHTMLTotalAndSubtotals( 585 static void WriteHTMLTotalAndSubtotals(
585 const DataCollector::Collection& match_array, 586 const DataCollector::Collection& match_array,
586 const Comparator& comparator, std::string* output); 587 const Comparator& comparator, std::string* output);
587 588
588 // Constructs a DictionaryValue instance containing all recursive results in 589 // Constructs a DictionaryValue instance containing all recursive results in
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 // The following functions should all be private, and are only public because 636 // The following functions should all be private, and are only public because
636 // the collection is done externally. We need to relocate that code from the 637 // the collection is done externally. We need to relocate that code from the
637 // collection class into this class, and then all these methods can be made 638 // collection class into this class, and then all these methods can be made
638 // private. 639 // private.
639 // (Thread safe) Get start of list of all ThreadData instances. 640 // (Thread safe) Get start of list of all ThreadData instances.
640 static ThreadData* first(); 641 static ThreadData* first();
641 // Iterate through the null terminated list of ThreadData instances. 642 // Iterate through the null terminated list of ThreadData instances.
642 ThreadData* next() const { return next_; } 643 ThreadData* next() const { return next_; }
643 // Using our lock, make a copy of the specified maps. These calls may arrive 644 // Using our lock, make a copy of the specified maps. These calls may arrive
644 // from non-local threads, and are used to quickly scan data from all threads 645 // from non-local threads, and are used to quickly scan data from all threads
645 // in order to build an HTML page for about:tracking. 646 // in order to build an HTML page for about:profiler.
646 void SnapshotBirthMap(BirthMap *output) const; 647 void SnapshotBirthMap(BirthMap *output) const;
647 void SnapshotDeathMap(DeathMap *output) const; 648 void SnapshotDeathMap(DeathMap *output) const;
648 // -------- end of should be private methods. 649 // -------- end of should be private methods.
649 650
650 // Hack: asynchronously clear all birth counts and death tallies data values 651 // Hack: asynchronously clear all birth counts and death tallies data values
651 // in all ThreadData instances. The numerical (zeroing) part is done without 652 // in all ThreadData instances. The numerical (zeroing) part is done without
652 // use of a locks or atomics exchanges, and may (for int64 values) produce 653 // use of a locks or atomics exchanges, and may (for int64 values) produce
653 // bogus counts VERY rarely. 654 // bogus counts VERY rarely.
654 static void ResetAllThreadData(); 655 static void ResetAllThreadData();
655 656
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 static ThreadDataPool* unregistered_thread_data_pool_; 741 static ThreadDataPool* unregistered_thread_data_pool_;
741 // The next available thread number. This should only be accessed when the 742 // The next available thread number. This should only be accessed when the
742 // list_lock_ is held. 743 // list_lock_ is held.
743 static int thread_number_counter_; 744 static int thread_number_counter_;
744 // Incarnation sequence number, indicating how many times (during unittests) 745 // Incarnation sequence number, indicating how many times (during unittests)
745 // we've either transitioned out of UNINITIALIZED, or into that state. This 746 // we've either transitioned out of UNINITIALIZED, or into that state. This
746 // value is only accessed while the list_lock_ is held. 747 // value is only accessed while the list_lock_ is held.
747 static int incarnation_counter_; 748 static int incarnation_counter_;
748 // Protection for access to all_thread_data_list_head_, and to 749 // Protection for access to all_thread_data_list_head_, and to
749 // unregistered_thread_data_pool_. This lock is leaked at shutdown. 750 // unregistered_thread_data_pool_. This lock is leaked at shutdown.
750 static base::Lock* list_lock_; 751 // The lock is very infrequently used, so we can afford to just make a lazy
752 // instance and be safe.
753 static base::LazyInstance<base::Lock,
754 base::LeakyLazyInstanceTraits<base::Lock> > list_lock_;
751 755
752 // Record of what the incarnation_counter_ was when this instance was created. 756 // Record of what the incarnation_counter_ was when this instance was created.
753 // If the incarnation_counter_ has changed, then we avoid pushing into the 757 // If the incarnation_counter_ has changed, then we avoid pushing into the
754 // pool (this is only critical in tests which go through multiple 758 // pool (this is only critical in tests which go through multiple
755 // incarations). 759 // incarations).
756 int incarnation_count_for_pool_; 760 int incarnation_count_for_pool_;
757 761
758 // We set status_ to SHUTDOWN when we shut down the tracking service. 762 // We set status_ to SHUTDOWN when we shut down the tracking service.
759 static Status status_; 763 static Status status_;
760 764
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 } 818 }
815 819
816 private: 820 private:
817 821
818 DISALLOW_COPY_AND_ASSIGN(AutoTracking); 822 DISALLOW_COPY_AND_ASSIGN(AutoTracking);
819 }; 823 };
820 824
821 } // namespace tracked_objects 825 } // namespace tracked_objects
822 826
823 #endif // BASE_TRACKED_OBJECTS_H_ 827 #endif // BASE_TRACKED_OBJECTS_H_
OLDNEW
« no previous file with comments | « no previous file | base/tracked_objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698