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

Side by Side Diff: base/tracked_objects.h

Issue 8606001: Check that thread contexts are cleaned up during profiling (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') | base/tracked_objects.cc » ('J')
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>
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 // accumulated outside of execution of tracked runs. 525 // accumulated outside of execution of tracked runs.
526 static TrackedTime NowForStartOfRun(); 526 static TrackedTime NowForStartOfRun();
527 static TrackedTime NowForEndOfRun(); 527 static TrackedTime NowForEndOfRun();
528 528
529 // Provide a time function that does nothing (runs fast) when we don't have 529 // Provide a time function that does nothing (runs fast) when we don't have
530 // the profiler enabled. It will generally be optimized away when it is 530 // the profiler enabled. It will generally be optimized away when it is
531 // ifdef'ed to be small enough (allowing the profiler to be "compiled out" of 531 // ifdef'ed to be small enough (allowing the profiler to be "compiled out" of
532 // the code). 532 // the code).
533 static TrackedTime Now(); 533 static TrackedTime Now();
534 534
535 // This function can be called at process termination to validate that thread
536 // cleanup routines have been called for at least some number of named
537 // threads.
538 static void EnsureCleanupWasCalled(int major_threads_shutdown_count);
539
535 private: 540 private:
536 // Allow only tests to call ShutdownSingleThreadedCleanup. We NEVER call it 541 // Allow only tests to call ShutdownSingleThreadedCleanup. We NEVER call it
537 // in production code. 542 // in production code.
538 friend class TrackedObjectsTest; 543 friend class TrackedObjectsTest;
539 544
540 // Worker thread construction creates a name since there is none. 545 // Worker thread construction creates a name since there is none.
541 explicit ThreadData(int thread_number); 546 explicit ThreadData(int thread_number);
542 547
543 // Message loop based construction should provide a name. 548 // Message loop based construction should provide a name.
544 explicit ThreadData(const std::string& suggested_name); 549 explicit ThreadData(const std::string& suggested_name);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 // thread is done (terminated), we push it onto this llist. When a new worker 592 // thread is done (terminated), we push it onto this llist. When a new worker
588 // thread is created, we first try to re-use a ThreadData instance from the 593 // thread is created, we first try to re-use a ThreadData instance from the
589 // list, and if none are available, construct a new one. 594 // list, and if none are available, construct a new one.
590 // This is only accessed while list_lock_ is held. 595 // This is only accessed while list_lock_ is held.
591 static ThreadData* first_retired_worker_; 596 static ThreadData* first_retired_worker_;
592 597
593 // Link to the most recently created instance (starts a null terminated list). 598 // Link to the most recently created instance (starts a null terminated list).
594 // The list is traversed by about:profiler when it needs to snapshot data. 599 // The list is traversed by about:profiler when it needs to snapshot data.
595 // This is only accessed while list_lock_ is held. 600 // This is only accessed while list_lock_ is held.
596 static ThreadData* all_thread_data_list_head_; 601 static ThreadData* all_thread_data_list_head_;
597 // The next available thread number. This should only be accessed when the 602
598 // list_lock_ is held. 603 // The next available worker thread number. This should only be accessed when
599 static int thread_number_counter_; 604 // the list_lock_ is held.
605 static int worker_thread_data_creation_count_;
606
607 // The number of times TLS has called us back to cleanup a ThreadData
608 // instance. This is only accessed while list_lock_ is held.
609 static int cleanup_count_;
610
600 // Incarnation sequence number, indicating how many times (during unittests) 611 // Incarnation sequence number, indicating how many times (during unittests)
601 // we've either transitioned out of UNINITIALIZED, or into that state. This 612 // we've either transitioned out of UNINITIALIZED, or into that state. This
602 // value is only accessed while the list_lock_ is held. 613 // value is only accessed while the list_lock_ is held.
603 static int incarnation_counter_; 614 static int incarnation_counter_;
615
604 // Protection for access to all_thread_data_list_head_, and to 616 // Protection for access to all_thread_data_list_head_, and to
605 // unregistered_thread_data_pool_. This lock is leaked at shutdown. 617 // unregistered_thread_data_pool_. This lock is leaked at shutdown.
606 // The lock is very infrequently used, so we can afford to just make a lazy 618 // The lock is very infrequently used, so we can afford to just make a lazy
607 // instance and be safe. 619 // instance and be safe.
608 static base::LazyInstance<base::Lock, 620 static base::LazyInstance<base::Lock,
609 base::LeakyLazyInstanceTraits<base::Lock> > list_lock_; 621 base::LeakyLazyInstanceTraits<base::Lock> > list_lock_;
610 622
611 // Record of what the incarnation_counter_ was when this instance was created. 623 // Record of what the incarnation_counter_ was when this instance was created.
612 // If the incarnation_counter_ has changed, then we avoid pushing into the 624 // If the incarnation_counter_ has changed, then we avoid pushing into the
613 // pool (this is only critical in tests which go through multiple 625 // pool (this is only critical in tests which go through multiple
614 // incarations). 626 // incarations).
615 int incarnation_count_for_pool_; 627 int incarnation_count_for_pool_;
616 628
617 // We set status_ to SHUTDOWN when we shut down the tracking service. 629 // We set status_ to SHUTDOWN when we shut down the tracking service.
618 static Status status_; 630 static Status status_;
619 631
(...skipping 28 matching lines...) Expand all
648 // It is locked before changing, and hence other threads may access it by 660 // It is locked before changing, and hence other threads may access it by
649 // locking before reading it. 661 // locking before reading it.
650 DeathMap death_map_; 662 DeathMap death_map_;
651 663
652 // Lock to protect *some* access to BirthMap and DeathMap. The maps are 664 // Lock to protect *some* access to BirthMap and DeathMap. The maps are
653 // regularly read and written on this thread, but may only be read from other 665 // regularly read and written on this thread, but may only be read from other
654 // threads. To support this, we acquire this lock if we are writing from this 666 // threads. To support this, we acquire this lock if we are writing from this
655 // thread, or reading from another thread. For reading from this thread we 667 // thread, or reading from another thread. For reading from this thread we
656 // don't need a lock, as there is no potential for a conflict since the 668 // don't need a lock, as there is no potential for a conflict since the
657 // writing is only done from this thread. 669 // writing is only done from this thread.
658 mutable base::Lock lock_; 670 mutable base::Lock map_lock_;
659 671
660 DISALLOW_COPY_AND_ASSIGN(ThreadData); 672 DISALLOW_COPY_AND_ASSIGN(ThreadData);
661 }; 673 };
662 674
663 //------------------------------------------------------------------------------ 675 //------------------------------------------------------------------------------
664 // Provide simple way to to start global tracking, and to tear down tracking 676 // Provide simple way to to start global tracking, and to tear down tracking
665 // when done. The design has evolved to *not* do any teardown (and just leak 677 // when done. The design has evolved to *not* do any teardown (and just leak
666 // all allocated data structures). As a result, we don't have any code in this 678 // all allocated data structures). As a result, we don't have any code in this
667 // destructor, and perhaps this whole class should go away. 679 // destructor, and perhaps this whole class should go away.
668 680
(...skipping 11 matching lines...) Expand all
680 } 692 }
681 693
682 private: 694 private:
683 695
684 DISALLOW_COPY_AND_ASSIGN(AutoTracking); 696 DISALLOW_COPY_AND_ASSIGN(AutoTracking);
685 }; 697 };
686 698
687 } // namespace tracked_objects 699 } // namespace tracked_objects
688 700
689 #endif // BASE_TRACKED_OBJECTS_H_ 701 #endif // BASE_TRACKED_OBJECTS_H_
OLDNEW
« no previous file with comments | « no previous file | base/tracked_objects.cc » ('j') | base/tracked_objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698