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.
5
#ifndef STORAGE_LEVELDB_UTIL_ARENA_H_
6
#define STORAGE_LEVELDB_UTIL_ARENA_H_
20
// Return a pointer to a newly allocated memory block of "bytes" bytes.
21
char* Allocate(size_t bytes);
23
// Allocate memory with the normal alignment guarantees provided by malloc
24
char* AllocateAligned(size_t bytes);
26
// Returns an estimate of the total memory usage of data allocated
27
// by the arena (including space allocated but not yet used for user
29
size_t MemoryUsage() const {
30
return blocks_memory_ + blocks_.capacity() * sizeof(char*);
34
char* AllocateFallback(size_t bytes);
35
char* AllocateNewBlock(size_t block_bytes);
39
size_t alloc_bytes_remaining_;
41
// Array of new[] allocated memory blocks
42
std::vector<char*> blocks_;
44
// Bytes of memory in blocks allocated so far
45
size_t blocks_memory_;
49
void operator=(const Arena&);
52
inline 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).
57
if (bytes <= alloc_bytes_remaining_) {
58
char* result = alloc_ptr_;
60
alloc_bytes_remaining_ -= bytes;
63
return AllocateFallback(bytes);
66
} // namespace leveldb
68
#endif // STORAGE_LEVELDB_UTIL_ARENA_H_