OLD | NEW |
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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 // the profiler enabled. It will generally be optimized away when it is | 518 // the profiler enabled. It will generally be optimized away when it is |
519 // ifdef'ed to be small enough (allowing the profiler to be "compiled out" of | 519 // ifdef'ed to be small enough (allowing the profiler to be "compiled out" of |
520 // the code). | 520 // the code). |
521 static TrackedTime Now(); | 521 static TrackedTime Now(); |
522 | 522 |
523 private: | 523 private: |
524 // Allow only tests to call ShutdownSingleThreadedCleanup. We NEVER call it | 524 // Allow only tests to call ShutdownSingleThreadedCleanup. We NEVER call it |
525 // in production code. | 525 // in production code. |
526 friend class TrackedObjectsTest; | 526 friend class TrackedObjectsTest; |
527 | 527 |
528 typedef std::stack<const ThreadData*> ThreadDataPool; | 528 // Implment a stack that avoids allocations during a push() by having enough |
| 529 // space ahead of time. |
| 530 class ThreadDataPool { |
| 531 public: |
| 532 ThreadDataPool(); |
| 533 ~ThreadDataPool(); |
| 534 |
| 535 // Make sure the stack is large enough to support the indicated number of |
| 536 // elements. |
| 537 void reserve(size_t largest_worker_pool_number); |
| 538 |
| 539 bool empty() const; |
| 540 const ThreadData* top() const; |
| 541 void push(const ThreadData* thread_data); |
| 542 void pop(); |
| 543 |
| 544 private: |
| 545 std::vector<const ThreadData*> stack_; |
| 546 size_t empty_slot_; |
| 547 DISALLOW_COPY_AND_ASSIGN(ThreadDataPool); |
| 548 }; |
529 | 549 |
530 // Worker thread construction creates a name since there is none. | 550 // Worker thread construction creates a name since there is none. |
531 ThreadData(); | 551 explicit ThreadData(size_t thread_number); |
| 552 |
532 // Message loop based construction should provide a name. | 553 // Message loop based construction should provide a name. |
533 explicit ThreadData(const std::string& suggested_name); | 554 explicit ThreadData(const std::string& suggested_name); |
534 | 555 |
535 ~ThreadData(); | 556 ~ThreadData(); |
536 | 557 |
537 // Push this instance to the head of all_thread_data_list_head_, linking it to | 558 // Push this instance to the head of all_thread_data_list_head_, linking it to |
538 // the previous head. This is performed after each construction, and leaves | 559 // the previous head. This is performed after each construction, and leaves |
539 // the instance permanently on that list. | 560 // the instance permanently on that list. |
540 void PushToHeadOfList(); | 561 void PushToHeadOfList(); |
541 | 562 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 // registered instances (corresponds to all registered threads where we keep | 630 // registered instances (corresponds to all registered threads where we keep |
610 // data). | 631 // data). |
611 ThreadData* next_; | 632 ThreadData* next_; |
612 | 633 |
613 // The name of the thread that is being recorded. If this thread has no | 634 // The name of the thread that is being recorded. If this thread has no |
614 // message_loop, then this is a worker thread, with a sequence number postfix. | 635 // message_loop, then this is a worker thread, with a sequence number postfix. |
615 std::string thread_name_; | 636 std::string thread_name_; |
616 | 637 |
617 // Indicate if this is a worker thread, and the ThreadData contexts should be | 638 // Indicate if this is a worker thread, and the ThreadData contexts should be |
618 // stored in the unregistered_thread_data_pool_ when not in use. | 639 // stored in the unregistered_thread_data_pool_ when not in use. |
619 bool is_a_worker_thread_; | 640 // Value is zero when it is not a worker thread. Value is a positive integer |
| 641 // corresponding to the created thread name if it is a worker thread. |
| 642 size_t worker_thread_number_; |
620 | 643 |
621 // A map used on each thread to keep track of Births on this thread. | 644 // A map used on each thread to keep track of Births on this thread. |
622 // This map should only be accessed on the thread it was constructed on. | 645 // This map should only be accessed on the thread it was constructed on. |
623 // When a snapshot is needed, this structure can be locked in place for the | 646 // When a snapshot is needed, this structure can be locked in place for the |
624 // duration of the snapshotting activity. | 647 // duration of the snapshotting activity. |
625 BirthMap birth_map_; | 648 BirthMap birth_map_; |
626 | 649 |
627 // Similar to birth_map_, this records informations about death of tracked | 650 // Similar to birth_map_, this records informations about death of tracked |
628 // instances (i.e., when a tracked instance was destroyed on this thread). | 651 // instances (i.e., when a tracked instance was destroyed on this thread). |
629 // It is locked before changing, and hence other threads may access it by | 652 // It is locked before changing, and hence other threads may access it by |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 } | 684 } |
662 | 685 |
663 private: | 686 private: |
664 | 687 |
665 DISALLOW_COPY_AND_ASSIGN(AutoTracking); | 688 DISALLOW_COPY_AND_ASSIGN(AutoTracking); |
666 }; | 689 }; |
667 | 690 |
668 } // namespace tracked_objects | 691 } // namespace tracked_objects |
669 | 692 |
670 #endif // BASE_TRACKED_OBJECTS_H_ | 693 #endif // BASE_TRACKED_OBJECTS_H_ |
OLD | NEW |