Botan  1.10.16
Public Member Functions | Static Public Member Functions | List of all members
Botan::MemoryMapping_Allocator Class Reference

#include <mmap_mem.h>

Inheritance diagram for Botan::MemoryMapping_Allocator:
Botan::Pooling_Allocator Botan::Allocator

Public Member Functions

void * allocate (size_t)
 
void deallocate (void *, size_t)
 
void destroy ()
 
virtual void init ()
 
 MemoryMapping_Allocator (Mutex *mutex)
 
std::string type () const
 

Static Public Member Functions

static Allocatorget (bool locking)
 

Detailed Description

Allocator that uses memory maps backed by disk. We zeroize the map upon deallocation. If swap occurs, the VM will swap to the shared file backing rather than to a swap device, which means we know where it is and can zap it later.

Definition at line 21 of file mmap_mem.h.

Constructor & Destructor Documentation

◆ MemoryMapping_Allocator()

Botan::MemoryMapping_Allocator::MemoryMapping_Allocator ( Mutex mutex)
inline
Parameters
mutexused for internal locking

Definition at line 27 of file mmap_mem.h.

27 : Pooling_Allocator(mutex) {}
Pooling_Allocator(Mutex *mutex)
Definition: mem_pool.cpp:99

Member Function Documentation

◆ allocate()

void * Botan::Pooling_Allocator::allocate ( size_t  n)
virtualinherited

Allocate a block of memory

Parameters
nhow many bytes to allocate
Returns
pointer to n bytes of memory

Implements Botan::Allocator.

Definition at line 133 of file mem_pool.cpp.

134  {
135  const size_t BITMAP_SIZE = Memory_Block::bitmap_size();
136  const size_t BLOCK_SIZE = Memory_Block::block_size();
137 
138  Mutex_Holder lock(mutex);
139 
140  if(n <= BITMAP_SIZE * BLOCK_SIZE)
141  {
142  const size_t block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE;
143 
144  byte* mem = allocate_blocks(block_no);
145  if(mem)
146  return mem;
147 
148  get_more_core(BOTAN_MEM_POOL_CHUNK_SIZE);
149 
150  mem = allocate_blocks(block_no);
151  if(mem)
152  return mem;
153 
154  throw Memory_Exhaustion();
155  }
156 
157  void* new_buf = alloc_block(n);
158  if(new_buf)
159  return new_buf;
160 
161  throw Memory_Exhaustion();
162  }
unsigned char byte
Definition: types.h:22
T round_up(T n, T align_to)
Definition: rounding.h:22

◆ deallocate()

void Botan::Pooling_Allocator::deallocate ( void *  ptr,
size_t  n 
)
virtualinherited

Deallocate memory allocated with allocate()

Parameters
ptrthe pointer returned by allocate()
nthe size of the block pointed to by ptr

Implements Botan::Allocator.

Definition at line 167 of file mem_pool.cpp.

168  {
169  const size_t BITMAP_SIZE = Memory_Block::bitmap_size();
170  const size_t BLOCK_SIZE = Memory_Block::block_size();
171 
172  if(ptr == 0 || n == 0)
173  return;
174 
175  Mutex_Holder lock(mutex);
176 
177  if(n > BITMAP_SIZE * BLOCK_SIZE)
178  dealloc_block(ptr, n);
179  else
180  {
181  const size_t block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE;
182 
183  std::vector<Memory_Block>::iterator i =
184  std::lower_bound(blocks.begin(), blocks.end(), Memory_Block(ptr));
185 
186  if(i == blocks.end() || !i->contains(ptr, block_no))
187  throw Invalid_State("Pointer released to the wrong allocator");
188 
189  i->free(ptr, block_no);
190  }
191  }
T round_up(T n, T align_to)
Definition: rounding.h:22

◆ destroy()

void Botan::Pooling_Allocator::destroy ( )
virtualinherited

Shutdown the allocator

Reimplemented from Botan::Allocator.

Definition at line 119 of file mem_pool.cpp.

120  {
121  Mutex_Holder lock(mutex);
122 
123  blocks.clear();
124 
125  for(size_t j = 0; j != allocated.size(); ++j)
126  dealloc_block(allocated[j].first, allocated[j].second);
127  allocated.clear();
128  }

◆ get()

Allocator * Botan::Allocator::get ( bool  locking)
staticinherited

Acquire a pointer to an allocator

Parameters
lockingis true if the allocator should attempt to secure the memory (eg for using to store keys)
Returns
pointer to an allocator; ownership remains with library, so do not delete

Definition at line 90 of file defalloc.cpp.

References alloc, Botan::Library_State::get_allocator(), Botan::Global_State_Management::global_state(), and Botan::Malloc_Allocator::type().

Referenced by Botan::GMP_Engine::GMP_Engine(), and Botan::MemoryRegion< word >::init().

91  {
92  std::string type = "";
93  if(!locking)
94  type = "malloc";
95 
96  Allocator* alloc = global_state().get_allocator(type);
97  if(alloc)
98  return alloc;
99 
100  throw Internal_Error("Couldn't find an allocator to use in get_allocator");
101  }
Allocator * get_allocator(const std::string &name="") const
Definition: libstate.cpp:67
Library_State & global_state()
virtual std::string type() const =0
Allocator * alloc
Definition: bzip2.cpp:29

◆ init()

virtual void Botan::Allocator::init ( )
inlinevirtualinherited

Initialize the allocator

Definition at line 53 of file allocate.h.

Referenced by Botan::Library_State::add_allocator().

53 {}

◆ type()

std::string Botan::MemoryMapping_Allocator::type ( ) const
inlinevirtual
Returns
name of this allocator type

Implements Botan::Allocator.

Definition at line 28 of file mmap_mem.h.

28 { return "mmap"; }

The documentation for this class was generated from the following files: