29 #if defined __GNUC__ && !defined _WIN32 34 #if defined HAVE_MLOCK 43 #undef ELECTRONEUM_DEFAULT_LOG_CATEGORY 44 #define ELECTRONEUM_DEFAULT_LOG_CATEGORY "mlocker" 48 static std::atomic<bool> previously_failed{
false };
50 static size_t query_page_size()
52 #if defined HAVE_MLOCK 53 long ret = sysconf(_SC_PAGESIZE);
56 MERROR(
"Failed to determine page size");
61 #warning Missing query_page_size implementation 66 static void do_lock(
void *ptr,
size_t len)
68 #if defined HAVE_MLOCK 69 int ret = mlock(ptr, len);
70 if (ret < 0 && !previously_failed.exchange(
true))
71 MERROR(
"Error locking page at " << ptr <<
": " << strerror(errno) <<
", subsequent mlock errors will be silenced");
73 #warning Missing do_lock implementation 77 static void do_unlock(
void *ptr,
size_t len)
79 #if defined HAVE_MLOCK 80 int ret = munlock(ptr, len);
84 if (ret < 0 && !previously_failed.load())
85 MERROR(
"Error unlocking page at " << ptr <<
": " << strerror(errno));
87 #warning Missing implementation of page size detection 93 size_t mlocker::page_size = 0;
94 size_t mlocker::num_locked_objects = 0;
96 boost::mutex &mlocker::mutex()
98 static boost::mutex *vmutex =
new boost::mutex();
101 std::map<size_t, unsigned int> &mlocker::map()
103 static std::map<size_t, unsigned int> *vmap =
new std::map<size_t, unsigned int>();
111 page_size = query_page_size();
135 const size_t first = ((
uintptr_t)ptr) / page_size;
136 const size_t last = (((
uintptr_t)ptr) + len - 1) / page_size;
137 for (
size_t page = first; page <= last; ++page)
139 ++num_locked_objects;
152 const size_t first = ((
uintptr_t)ptr) / page_size;
153 const size_t last = (((
uintptr_t)ptr) + len - 1) / page_size;
154 for (
size_t page = first; page <= last; ++page)
156 --num_locked_objects;
170 return num_locked_objects;
173 void mlocker::lock_page(
size_t page)
175 std::pair<std::map<size_t, unsigned int>::iterator,
bool> p = map().insert(std::make_pair(page, 1));
178 do_lock((
void*)(page * page_size), page_size);
186 void mlocker::unlock_page(
size_t page)
188 std::map<size_t, unsigned int>::iterator i = map().find(page);
189 if (i == map().end())
191 MERROR(
"Attempt to unlock unlocked page at " << (
void*)(page * page_size));
198 do_unlock((
void*)(page * page_size), page_size);
static void lock(void *ptr, size_t len)
static size_t get_page_size()
mlocker(void *ptr, size_t len)
_W64 unsigned int uintptr_t
#define CRITICAL_REGION_LOCAL(x)
static size_t get_num_locked_objects()
static size_t get_num_locked_pages()
#define CATCH_ENTRY_L1(lacation, return_val)
static void unlock(void *ptr, size_t len)