6 #ifndef BITCOIN_ALLOCATORS_H
7 #define BITCOIN_ALLOCATORS_H
13 #include <boost/thread/mutex.hpp>
14 #include <boost/thread/once.hpp>
15 #include <openssl/crypto.h>
35 assert(!(page_size & (page_size-1)));
48 boost::mutex::scoped_lock lock(
mutex);
50 const size_t base_addr =
reinterpret_cast<size_t>(p);
51 const size_t start_page = base_addr &
page_mask;
52 const size_t end_page = (base_addr + size - 1) & page_mask;
53 for(
size_t page = start_page; page <= end_page; page +=
page_size)
55 Histogram::iterator it =
histogram.find(page);
59 histogram.insert(std::make_pair(page, 1));
71 boost::mutex::scoped_lock lock(
mutex);
73 const size_t base_addr =
reinterpret_cast<size_t>(p);
74 const size_t start_page = base_addr &
page_mask;
75 const size_t end_page = (base_addr + size - 1) & page_mask;
76 for(
size_t page = start_page; page <= end_page; page +=
page_size)
78 Histogram::iterator it =
histogram.find(page);
94 boost::mutex::scoped_lock lock(
mutex);
118 bool Lock(
const void *addr,
size_t len);
122 bool Unlock(
const void *addr,
size_t len);
172 OPENSSL_cleanse((
void*)(&t),
sizeof(T));
184 typedef std::allocator<T>
base;
194 template <
typename U>
203 p = std::allocator<T>::allocate(n, hint);
213 OPENSSL_cleanse(p,
sizeof(T) * n);
216 std::allocator<T>::deallocate(p, n);
228 typedef std::allocator<T>
base;
238 template <
typename U>
247 OPENSSL_cleanse(p,
sizeof(T) * n);
248 std::allocator<T>::deallocate(p, n);
void UnlockObject(const T &t)
base::const_reference const_reference
secure_allocator(const secure_allocator &a)
LockedPageManagerBase(size_t page_size)
void LockRange(void *p, size_t size)
Thread-safe class to keep track of locked (ie, non-swappable) memory pages.
base::const_pointer const_pointer
base::size_type size_type
static boost::once_flag init_flag
base::value_type value_type
base::value_type value_type
secure_allocator< _Other > other
~zero_after_free_allocator()
bool Unlock(const void *addr, size_t len)
Unlock memory pages.
void LockObject(const T &t)
static void CreateInstance()
std::map< size_t, int > Histogram
zero_after_free_allocator< _Other > other
base::const_reference const_reference
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
base::reference reference
Singleton class to keep track of locked (ie, non-swappable) memory pages, for use in std::allocator t...
secure_allocator(const secure_allocator< U > &a)
static LockedPageManager & Instance()
OS-dependent memory page locking/unlocking.
base::const_pointer const_pointer
zero_after_free_allocator(const zero_after_free_allocator &a)
base::size_type size_type
zero_after_free_allocator(const zero_after_free_allocator< U > &a)
void UnlockRange(void *p, size_t size)
T * allocate(std::size_t n, const void *hint=0)
base::difference_type difference_type
static LockedPageManager * _instance
void deallocate(T *p, std::size_t n)
zero_after_free_allocator()
base::difference_type difference_type
void deallocate(T *p, std::size_t n)
base::reference reference
bool Lock(const void *addr, size_t len)
Lock memory pages.