Bitcoin
arena.h
Go to the documentation of this file.
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.
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_;
40 
41  // Array of new[] allocated memory blocks
42  std::vector<char*> blocks_;
43 
44  // Total memory usage of the arena.
46 
47  // No copying allowed
48  Arena(const Arena&);
49  void operator=(const Arena&);
50 };
51 
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).
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_
Definition: autocompact_test.cc:11
Definition: port_example.h:75
char * alloc_ptr_
Definition: arena.h:38
char * Allocate(size_t bytes)
Definition: arena.h:52
Definition: arena.h:16
Arena()
Definition: arena.cc:12
void operator=(const Arena &)
char * AllocateAligned(size_t bytes)
Definition: arena.cc:41
~Arena()
Definition: arena.cc:17
char * AllocateNewBlock(size_t block_bytes)
Definition: arena.cc:60
void * NoBarrier_Load() const
Definition: port_win.cc:139
char * AllocateFallback(size_t bytes)
Definition: arena.cc:23
size_t MemoryUsage() const
Definition: arena.h:29
port::AtomicPointer memory_usage_
Definition: arena.h:45
std::vector< char * > blocks_
Definition: arena.h:42
size_t alloc_bytes_remaining_
Definition: arena.h:39