diff options
Diffstat (limited to 'runtime/base/allocator.h')
-rw-r--r-- | runtime/base/allocator.h | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/runtime/base/allocator.h b/runtime/base/allocator.h index 2c3e966d32..95dd407924 100644 --- a/runtime/base/allocator.h +++ b/runtime/base/allocator.h @@ -22,7 +22,7 @@ #include "atomic.h" #include "base/macros.h" #include "base/mutex.h" -#include "utils.h" +#include "base/type_static_if.h" namespace art { @@ -71,26 +71,35 @@ enum AllocatorTag { }; std::ostream& operator<<(std::ostream& os, const AllocatorTag& tag); -class TrackedAllocators { - public: - static bool Add(uint32_t tag, AtomicInteger* bytes_used); - static void Dump(std::ostream& os); - static void RegisterAllocation(AllocatorTag tag, uint64_t bytes) { - total_bytes_used_[tag].FetchAndAddSequentiallyConsistent(bytes); - uint64_t new_bytes = bytes_used_[tag].FetchAndAddSequentiallyConsistent(bytes) + bytes; - max_bytes_used_[tag].StoreRelaxed(std::max(max_bytes_used_[tag].LoadRelaxed(), new_bytes)); - } - static void RegisterFree(AllocatorTag tag, uint64_t bytes) { - bytes_used_[tag].FetchAndSubSequentiallyConsistent(bytes); +namespace TrackedAllocators { + +// Running count of number of bytes used for this kind of allocation. Increased by allocations, +// decreased by deallocations. +extern Atomic<size_t> g_bytes_used[kAllocatorTagCount]; + +// Largest value of bytes used seen. +extern volatile size_t g_max_bytes_used[kAllocatorTagCount]; + +// Total number of bytes allocated of this kind. +extern Atomic<uint64_t> g_total_bytes_used[kAllocatorTagCount]; + +void Dump(std::ostream& os); + +inline void RegisterAllocation(AllocatorTag tag, size_t bytes) { + g_total_bytes_used[tag].FetchAndAddSequentiallyConsistent(bytes); + size_t new_bytes = g_bytes_used[tag].FetchAndAddSequentiallyConsistent(bytes) + bytes; + if (g_max_bytes_used[tag] < new_bytes) { + g_max_bytes_used[tag] = new_bytes; } +} - private: - static Atomic<uint64_t> bytes_used_[kAllocatorTagCount]; - static Atomic<uint64_t> max_bytes_used_[kAllocatorTagCount]; - static Atomic<uint64_t> total_bytes_used_[kAllocatorTagCount]; -}; +inline void RegisterFree(AllocatorTag tag, size_t bytes) { + g_bytes_used[tag].FetchAndSubSequentiallyConsistent(bytes); +} + +} // namespace TrackedAllocators -// Tracking allocator, tracks how much memory is used. +// Tracking allocator for use with STL types, tracks how much memory is used. template<class T, AllocatorTag kTag> class TrackingAllocatorImpl { public: @@ -132,7 +141,7 @@ class TrackingAllocatorImpl { free(p); } - static AllocatorTag GetTag() { + static constexpr AllocatorTag GetTag() { return kTag; } }; |