1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. 4 5 #ifndef STORAGE_LEVELDB_UTIL_ARENA_H_ 6 #define STORAGE_LEVELDB_UTIL_ARENA_H_ 7 8 #include <vector> 9 #include <assert.h> 10 #include <stddef.h> 11 #include <stdint.h> 12 #include "port/port.h" 13 14 namespace leveldb { 15 16 class Arena { 17 public: 18 Arena(); 19 ~Arena(); 20 21 // Return a pointer to a newly allocated memory block of "bytes" bytes. 22 char* Allocate(size_t bytes); 23 24 // Allocate memory with the normal alignment guarantees provided by malloc 25 char* AllocateAligned(size_t bytes); 26 27 // Returns an estimate of the total memory usage of data allocated 28 // by the arena. MemoryUsage()29 size_t MemoryUsage() const { 30 return reinterpret_cast<uintptr_t>(memory_usage_.NoBarrier_Load()); 31 } 32 33 private: 34 char* AllocateFallback(size_t bytes); 35 char* AllocateNewBlock(size_t block_bytes); 36 37 // Allocation state 38 char* alloc_ptr_; 39 size_t alloc_bytes_remaining_; 40 41 // Array of new[] allocated memory blocks 42 std::vector<char*> blocks_; 43 44 // Total memory usage of the arena. 45 port::AtomicPointer memory_usage_; 46 47 // No copying allowed 48 Arena(const Arena&); 49 void operator=(const Arena&); 50 }; 51 Allocate(size_t bytes)52inline char* Arena::Allocate(size_t bytes) { 53 // The semantics of what to return are a bit messy if we allow 54 // 0-byte allocations, so we disallow them here (we don't need 55 // them for our internal use). 56 assert(bytes > 0); 57 if (bytes <= alloc_bytes_remaining_) { 58 char* result = alloc_ptr_; 59 alloc_ptr_ += bytes; 60 alloc_bytes_remaining_ -= bytes; 61 return result; 62 } 63 return AllocateFallback(bytes); 64 } 65 66 } // namespace leveldb 67 68 #endif // STORAGE_LEVELDB_UTIL_ARENA_H_ 69