Chromium Code Reviews| Index: base/debug/activity_tracker.h |
| diff --git a/base/debug/activity_tracker.h b/base/debug/activity_tracker.h |
| index d6ff724cf2daee6106c3fbce75b9622f1d7a9eda..72163962add97f0568839f07ee81554cb1d1f2e6 100644 |
| --- a/base/debug/activity_tracker.h |
| +++ b/base/debug/activity_tracker.h |
| @@ -23,6 +23,7 @@ |
| #include "base/base_export.h" |
| #include "base/location.h" |
| #include "base/metrics/persistent_memory_allocator.h" |
| +#include "base/threading/platform_thread.h" |
| #include "base/threading/thread_checker.h" |
| #include "base/threading/thread_local_storage.h" |
| @@ -41,6 +42,7 @@ namespace debug { |
| class ThreadActivityTracker; |
| + |
| enum : int { |
| // The maximum number of call-stack addresses stored per activity. This |
| // cannot be changed without also changing the version number of the |
| @@ -342,6 +344,46 @@ class BASE_EXPORT ThreadActivityTracker { |
| // the thread trackers is taken from a PersistentMemoryAllocator which allows |
| // for the data to be analyzed by a parallel process or even post-mortem. |
| class BASE_EXPORT GlobalActivityTracker { |
| + template <typename T> |
| + class ThreadSafeStack { |
| + public: |
| + ThreadSafeStack(size_t size) |
| + : size_(size), values_(new T[size]), used_(0) {} |
| + ~ThreadSafeStack() {} |
| + |
| + size_t size() { return size_; } |
| + size_t used() { |
| + base::AutoLock autolock(lock_); |
| + return used_; |
| + } |
| + |
| + bool push(T value) { |
| + base::AutoLock autolock(lock_); |
| + if (used_ == size_) |
| + return false; |
| + values_[used_++] = value; |
| + return true; |
| + } |
| + |
| + bool pop(T* out_value) { |
| + base::AutoLock autolock(lock_); |
| + if (used_ == 0) |
| + return false; |
| + *out_value = values_[--used_]; |
| + return true; |
| + } |
| + |
| + private: |
| + const size_t size_; |
| + |
| + std::unique_ptr<T[]> values_; |
| + size_t used_; |
| + base::Lock lock_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(ThreadSafeStack); |
| + }; |
| + |
| public: |
| // Type identifiers used when storing in persistent memory so they can be |
| // identified during extraction; the first 4 bytes of the SHA1 of the name |
| @@ -508,9 +550,7 @@ class BASE_EXPORT GlobalActivityTracker { |
| // These have to be lock-free because lock activity is tracked and causes |
|
manzagop (departed)
2016/09/01 15:46:48
Update comment?
bcwhite
2016/09/02 14:20:35
Done.
|
| // re-entry problems. |
| std::atomic<int> thread_tracker_count_; |
| - std::atomic<int> available_memories_count_; |
| - std::atomic<PersistentMemoryAllocator::Reference> |
| - available_memories_[kMaxThreadCount]; |
| + ThreadSafeStack<PersistentMemoryAllocator::Reference> available_memories_; |
| // The active global activity tracker. |
| static GlobalActivityTracker* g_tracker_; |