• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 26995937053

04 Jun 2026 09:38PM UTC coverage: 89.394% (-2.3%) from 91.672%
26995937053

push

github

web-flow
Merge pull request #5642 from randombit/jack/prefetch-in-ks

Improve prefetching for table based implementations

110588 of 123708 relevant lines covered (89.39%)

11056434.37 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.76
/src/lib/utils/locking_allocator/locking_allocator.cpp
1
/*
2
* Mlock Allocator
3
* (C) 2012,2014,2015 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7

8
#include <botan/internal/locking_allocator.h>
9

10
#include <botan/compiler.h>
11
#include <botan/internal/int_utils.h>
12
#include <botan/internal/mem_pool.h>
13
#include <botan/internal/os_utils.h>
14

15
namespace Botan {
16

17
void* mlock_allocator::allocate(size_t num_elems, size_t elem_size) {
137,825,431✔
18
   if(!m_pool) {
137,825,431✔
19
      return nullptr;
20
   }
21

22
   if(auto n = checked_mul(num_elems, elem_size)) {
275,650,862✔
23
      return m_pool->allocate(*n);
137,825,431✔
24
   } else {
25
      // overflow!
26
      return nullptr;
27
   }
28
}
29

30
bool mlock_allocator::deallocate(void* p, size_t num_elems, size_t elem_size) noexcept {
137,825,005✔
31
   if(!m_pool) {
137,825,005✔
32
      return false;
33
   }
34

35
   if(auto n = checked_mul(num_elems, elem_size)) {
275,650,010✔
36
      return m_pool->deallocate(p, *n);
137,825,005✔
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
}
45

46
mlock_allocator::mlock_allocator() noexcept {
4,360✔
47
   try {
4,360✔
48
      const size_t mem_to_lock = OS::get_memory_locking_limit();
4,360✔
49
      const size_t page_size = OS::system_page_size();
4,360✔
50

51
      if(mem_to_lock > 0 && mem_to_lock % page_size == 0) {
4,360✔
52
         m_locked_pages = OS::allocate_locked_pages(mem_to_lock / page_size);
4,360✔
53

54
         if(!m_locked_pages.empty()) {
4,360✔
55
            m_pool = std::make_unique<Memory_Pool>(m_locked_pages, page_size);
4,360✔
56
         }
57
      }
58
   } catch(...) {
×
59
      OS::free_locked_pages(m_locked_pages);
×
60
      m_locked_pages.clear();
×
61
      m_pool.reset();
×
62
   }
×
63
}
4,360✔
64

65
mlock_allocator::~mlock_allocator() {
4,360✔
66
   if(m_pool) {
4,360✔
67
      m_pool.reset();
4,360✔
68
      // OS::free_locked_pages scrubs the memory before free
69
      OS::free_locked_pages(m_locked_pages);
4,360✔
70
   }
71
}
4,360✔
72

73
namespace {
74

75
// NOLINTNEXTLINE(*-avoid-non-const-global-variables)
76
BOTAN_EARLY_INIT(101) mlock_allocator g_mlock_allocator;
77

78
}  // namespace
79

80
mlock_allocator& mlock_allocator::instance() noexcept {
275,650,899✔
81
   return g_mlock_allocator;
275,650,899✔
82
}
83

84
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc