diff options
Diffstat (limited to 'compiler/utils')
| -rw-r--r-- | compiler/utils/arena_allocator.cc | 9 | ||||
| -rw-r--r-- | compiler/utils/arena_allocator.h | 11 |
2 files changed, 17 insertions, 3 deletions
diff --git a/compiler/utils/arena_allocator.cc b/compiler/utils/arena_allocator.cc index 004af98852..a80ad938a6 100644 --- a/compiler/utils/arena_allocator.cc +++ b/compiler/utils/arena_allocator.cc @@ -189,6 +189,15 @@ Arena* ArenaPool::AllocArena(size_t size) { return ret; } +size_t ArenaPool::GetBytesAllocated() const { + size_t total = 0; + MutexLock lock(Thread::Current(), lock_); + for (Arena* arena = free_arenas_; arena != nullptr; arena = arena->next_) { + total += arena->GetBytesAllocated(); + } + return total; +} + void ArenaPool::FreeArenaChain(Arena* first) { if (UNLIKELY(RUNNING_ON_VALGRIND > 0)) { for (Arena* arena = first; arena != nullptr; arena = arena->next_) { diff --git a/compiler/utils/arena_allocator.h b/compiler/utils/arena_allocator.h index 6d213991d3..7f5bc9ac4c 100644 --- a/compiler/utils/arena_allocator.h +++ b/compiler/utils/arena_allocator.h @@ -135,6 +135,10 @@ class Arena { return Size() - bytes_allocated_; } + size_t GetBytesAllocated() const { + return bytes_allocated_; + } + private: size_t bytes_allocated_; uint8_t* memory_; @@ -153,11 +157,12 @@ class ArenaPool { public: ArenaPool(); ~ArenaPool(); - Arena* AllocArena(size_t size); - void FreeArenaChain(Arena* first); + Arena* AllocArena(size_t size) LOCKS_EXCLUDED(lock_); + void FreeArenaChain(Arena* first) LOCKS_EXCLUDED(lock_); + size_t GetBytesAllocated() const LOCKS_EXCLUDED(lock_); private: - Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; + mutable Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; Arena* free_arenas_ GUARDED_BY(lock_); DISALLOW_COPY_AND_ASSIGN(ArenaPool); }; |