Bitcoin Core  27.99.0
P2P Digital Currency
Classes | Public Types | Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
LockedPool Class Reference

Pool for locked memory chunks. More...

#include <lockedpool.h>

Inheritance diagram for LockedPool:
[legend]

Classes

class  LockedPageArena
 Create an arena from locked pages. More...
 
struct  Stats
 Memory statistics. More...
 

Public Types

typedef bool(* LockingFailed_Callback) ()
 Callback when allocation succeeds but locking fails. More...
 

Public Member Functions

 LockedPool (std::unique_ptr< LockedPageAllocator > allocator, LockingFailed_Callback lf_cb_in=nullptr)
 Create a new LockedPool. More...
 
 ~LockedPool ()
 
 LockedPool (const LockedPool &other)=delete
 
LockedPooloperator= (const LockedPool &)=delete
 
void * alloc (size_t size)
 Allocate size bytes from this arena. More...
 
void free (void *ptr)
 Free a previously allocated chunk of memory. More...
 
Stats stats () const
 Get pool usage statistics. More...
 

Static Public Attributes

static const size_t ARENA_SIZE = 256*1024
 Size of one arena of locked memory. More...
 
static const size_t ARENA_ALIGN = 16
 Chunk alignment. More...
 

Private Member Functions

bool new_arena (size_t size, size_t align)
 

Private Attributes

std::unique_ptr< LockedPageAllocatorallocator
 
std::list< LockedPageArenaarenas
 
LockingFailed_Callback lf_cb
 
size_t cumulative_bytes_locked {0}
 
std::mutex mutex
 Mutex protects access to this pool's data structures, including arenas. More...
 

Detailed Description

Pool for locked memory chunks.

To avoid sensitive key data from being swapped to disk, the memory in this pool is locked/pinned.

An arena manages a contiguous region of memory. The pool starts out with one arena but can grow to multiple arenas if the need arises.

Unlike a normal C heap, the administrative structures are separate from the managed memory. This has been done as the sizes and bases of objects are not in themselves sensitive information, as to conserve precious locked memory. In some operating systems the amount of memory that can be locked is small.

Definition at line 126 of file lockedpool.h.

Member Typedef Documentation

◆ LockingFailed_Callback

typedef bool(* LockedPool::LockingFailed_Callback) ()

Callback when allocation succeeds but locking fails.

Definition at line 142 of file lockedpool.h.

Constructor & Destructor Documentation

◆ LockedPool() [1/2]

LockedPool::LockedPool ( std::unique_ptr< LockedPageAllocator allocator,
LockingFailed_Callback  lf_cb_in = nullptr 
)
explicit

Create a new LockedPool.

This takes ownership of the MemoryPageLocker, you can only instantiate this with LockedPool(std::move(...)).

The second argument is an optional callback when locking a newly allocated arena failed. If this callback is provided and returns false, the allocation fails (hard fail), if it returns true the allocation proceeds, but it could warn.

Definition at line 280 of file lockedpool.cpp.

◆ ~LockedPool()

LockedPool::~LockedPool ( )
default

◆ LockedPool() [2/2]

LockedPool::LockedPool ( const LockedPool other)
delete

Member Function Documentation

◆ alloc()

void * LockedPool::alloc ( size_t  size)

Allocate size bytes from this arena.

Returns pointer on success, or 0 if memory is full or the application tried to allocate 0 bytes.

Definition at line 287 of file lockedpool.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ free()

void LockedPool::free ( void *  ptr)

Free a previously allocated chunk of memory.

Freeing the zero pointer has no effect. Raises std::runtime_error in case of error.

Definition at line 309 of file lockedpool.cpp.

Here is the caller graph for this function:

◆ new_arena()

bool LockedPool::new_arena ( size_t  size,
size_t  align 
)
private

Definition at line 338 of file lockedpool.cpp.

Here is the caller graph for this function:

◆ operator=()

LockedPool& LockedPool::operator= ( const LockedPool )
delete

◆ stats()

LockedPool::Stats LockedPool::stats ( ) const

Get pool usage statistics.

Definition at line 323 of file lockedpool.cpp.

Here is the caller graph for this function:

Member Data Documentation

◆ allocator

std::unique_ptr<LockedPageAllocator> LockedPool::allocator
private

Definition at line 183 of file lockedpool.h.

◆ ARENA_ALIGN

const size_t LockedPool::ARENA_ALIGN = 16
static

Chunk alignment.

Another compromise. Setting this too high will waste memory, setting it too low will facilitate fragmentation.

Definition at line 138 of file lockedpool.h.

◆ ARENA_SIZE

const size_t LockedPool::ARENA_SIZE = 256*1024
static

Size of one arena of locked memory.

This is a compromise. Do not set this too low, as managing many arenas will increase allocation and deallocation overhead. Setting it too high allocates more locked memory from the OS than strictly necessary.

Definition at line 134 of file lockedpool.h.

◆ arenas

std::list<LockedPageArena> LockedPool::arenas
private

Definition at line 199 of file lockedpool.h.

◆ cumulative_bytes_locked

size_t LockedPool::cumulative_bytes_locked {0}
private

Definition at line 201 of file lockedpool.h.

◆ lf_cb

LockingFailed_Callback LockedPool::lf_cb
private

Definition at line 200 of file lockedpool.h.

◆ mutex

std::mutex LockedPool::mutex
mutableprivate

Mutex protects access to this pool's data structures, including arenas.

Definition at line 204 of file lockedpool.h.


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