Botan 3.8.1
Crypto and TLS for C&
Botan::mlock_allocator Class Referencefinal

#include <locking_allocator.h>

Public Member Functions

void * allocate (size_t num_elems, size_t elem_size)
 
bool deallocate (void *p, size_t num_elems, size_t elem_size) noexcept
 
 mlock_allocator ()
 
 mlock_allocator (const mlock_allocator &)=delete
 
mlock_allocatoroperator= (const mlock_allocator &)=delete
 
 ~mlock_allocator ()
 

Static Public Member Functions

static mlock_allocatorinstance ()
 

Detailed Description

Definition at line 19 of file locking_allocator.h.

Constructor & Destructor Documentation

◆ mlock_allocator() [1/2]

Botan::mlock_allocator::mlock_allocator ( const mlock_allocator & )
delete

References mlock_allocator().

Referenced by instance(), mlock_allocator(), and operator=().

◆ mlock_allocator() [2/2]

Botan::mlock_allocator::mlock_allocator ( )

Definition at line 46 of file locking_allocator.cpp.

46 {
47 const size_t mem_to_lock = OS::get_memory_locking_limit();
48 const size_t page_size = OS::system_page_size();
49
50 if(mem_to_lock > 0 && mem_to_lock % page_size == 0) {
51 m_locked_pages = OS::allocate_locked_pages(mem_to_lock / page_size);
52
53 if(!m_locked_pages.empty()) {
54 m_pool = std::make_unique<Memory_Pool>(m_locked_pages, page_size);
55 }
56 }
57}
size_t get_memory_locking_limit()
Definition os_utils.cpp:374
std::vector< void * > allocate_locked_pages(size_t count)
Definition os_utils.cpp:508
size_t system_page_size()
Definition os_utils.cpp:354

References Botan::OS::allocate_locked_pages(), Botan::OS::get_memory_locking_limit(), and Botan::OS::system_page_size().

◆ ~mlock_allocator()

Botan::mlock_allocator::~mlock_allocator ( )

Definition at line 59 of file locking_allocator.cpp.

59 {
60 if(m_pool) {
61 m_pool.reset();
62 // OS::free_locked_pages scrubs the memory before free
63 OS::free_locked_pages(m_locked_pages);
64 }
65}
void free_locked_pages(const std::vector< void * > &pages)
Definition os_utils.cpp:627

References Botan::OS::free_locked_pages().

Member Function Documentation

◆ allocate()

void * Botan::mlock_allocator::allocate ( size_t num_elems,
size_t elem_size )

Definition at line 17 of file locking_allocator.cpp.

17 {
18 if(!m_pool) {
19 return nullptr;
20 }
21
22 if(auto n = checked_mul(num_elems, elem_size)) {
23 return m_pool->allocate(n.value());
24 } else {
25 // overflow!
26 return nullptr;
27 }
28}
constexpr std::optional< T > checked_mul(T a, T b)
Definition int_utils.h:46

References Botan::checked_mul().

◆ deallocate()

bool Botan::mlock_allocator::deallocate ( void * p,
size_t num_elems,
size_t elem_size )
noexcept

Definition at line 30 of file locking_allocator.cpp.

30 {
31 if(!m_pool) {
32 return false;
33 }
34
35 if(auto n = checked_mul(num_elems, elem_size)) {
36 return m_pool->deallocate(p, n.value());
37 } else {
38 /*
39 We return nullptr in allocate if there was an overflow, so if an
40 overflow occurs here we know the pointer was not allocated by this pool.
41 */
42 return false;
43 }
44}

References Botan::checked_mul().

◆ instance()

mlock_allocator & Botan::mlock_allocator::instance ( )
static

Definition at line 74 of file locking_allocator.cpp.

74 {
75 return g_mlock_allocator;
76}

References instance(), and mlock_allocator().

Referenced by Botan::allocate_memory(), Botan::deallocate_memory(), Botan::initialize_allocator(), and instance().

◆ operator=()

mlock_allocator & Botan::mlock_allocator::operator= ( const mlock_allocator & )
delete

References mlock_allocator().


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