4 #include <boost/thread/mutex.hpp> 5 #include <boost/thread/once.hpp> 7 #include <openssl/crypto.h> 9 #include "zero_after_free_allocator.h" 23 template <
class Locker>
30 assert(!(page_size & (page_size - 1)));
31 page_mask = ~(page_size - 1);
36 assert(this->GetLockedPageCount() == 0);
41 void LockRange(
void* p,
size_t size)
43 boost::mutex::scoped_lock lock(mutex);
46 const size_t base_addr =
reinterpret_cast<size_t>(p);
47 const size_t start_page = base_addr & page_mask;
48 const size_t end_page = (base_addr + size - 1) & page_mask;
49 for (
size_t page = start_page; page <= end_page; page += page_size) {
50 Histogram::iterator it = histogram.find(page);
51 if (it == histogram.end())
53 locker.Lock(reinterpret_cast<void*>(page), page_size);
54 histogram.insert(std::make_pair(page, 1));
63 void UnlockRange(
void* p,
size_t size)
65 boost::mutex::scoped_lock lock(mutex);
68 const size_t base_addr =
reinterpret_cast<size_t>(p);
69 const size_t start_page = base_addr & page_mask;
70 const size_t end_page = (base_addr + size - 1) & page_mask;
71 for (
size_t page = start_page; page <= end_page; page += page_size) {
72 Histogram::iterator it = histogram.find(page);
73 assert(it != histogram.end());
79 locker.Unlock(reinterpret_cast<void*>(page), page_size);
86 int GetLockedPageCount()
88 boost::mutex::scoped_lock lock(mutex);
89 return histogram.size();
95 size_t page_size, page_mask;
97 typedef std::map<size_t, int> Histogram;
111 bool Lock(
const void* addr,
size_t len);
115 bool Unlock(
const void* addr,
size_t len);
134 boost::call_once(LockedPageManager::CreateInstance, LockedPageManager::init_flag);
135 return *LockedPageManager::_instance;
141 static void CreateInstance()
149 LockedPageManager::_instance = &instance;
153 static boost::once_flag init_flag;
160 template <
typename T>
161 void LockObject(
const T& t)
163 LockedPageManager::Instance().LockRange((
void*)(&t),
sizeof(T));
166 template <
typename T>
167 void UnlockObject(
const T& t)
169 OPENSSL_cleanse((
void*)(&t),
sizeof(T));
170 LockedPageManager::Instance().UnlockRange((
void*)(&t),
sizeof(T));
177 template <
typename T>
180 typedef std::allocator<T> base;
181 typedef typename base::size_type size_type;
182 typedef typename base::difference_type difference_type;
183 typedef typename base::pointer pointer;
184 typedef typename base::const_pointer const_pointer;
185 typedef typename base::reference reference;
186 typedef typename base::const_reference const_reference;
187 typedef typename base::value_type value_type;
190 template <
typename U>
195 template <
typename _Other>
200 T* allocate(std::size_t n,
const void* hint = 0)
203 p = std::allocator<T>::allocate(n, hint);
205 LockedPageManager::Instance().LockRange(p,
sizeof(T) * n);
209 void deallocate(T* p, std::size_t n)
212 OPENSSL_cleanse(p,
sizeof(T) * n);
213 LockedPageManager::Instance().UnlockRange(p,
sizeof(T) * n);
215 std::allocator<T>::deallocate(p, n);
220 typedef std::vector<char, zero_after_free_allocator<char> > CSerializeData;
222 #endif // ALLOCATORS_H Definition: allocators.h:24
Definition: allocators.h:178
Definition: allocators.h:196
Definition: allocators.h:129
Definition: allocators.h:105