// Copyright (c) 2009-2013 The Bitcoin Core developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html #include "support/pagelocker.h" #if defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" #endif #ifdef _WIN32 #ifdef _WIN32_WINNT #undef _WIN32_WINNT #endif #define _WIN32_WINNT 0x0501 #define WIN32_LEAN_AND_MEAN 1 #ifndef NOMINMAX #define NOMINMAX #endif #include // This is used to attempt to keep keying material out of swap // Note that VirtualLock does not provide this as a guarantee on Windows, // but, in practice, memory that has been VirtualLock'd almost never gets written to // the pagefile except in rare circumstances where memory is extremely low. #else #include #include // for PAGESIZE #include // for sysconf #endif LockedPageManager* LockedPageManager::_instance = NULL; boost::once_flag LockedPageManager::init_flag = BOOST_ONCE_INIT; /** Determine system page size in bytes */ static inline size_t GetSystemPageSize() { size_t page_size; #if defined(WIN32) SYSTEM_INFO sSysInfo; GetSystemInfo(&sSysInfo); page_size = sSysInfo.dwPageSize; #elif defined(PAGESIZE) // defined in limits.h page_size = PAGESIZE; #else // assume some POSIX OS page_size = sysconf(_SC_PAGESIZE); #endif return page_size; } bool MemoryPageLocker::Lock(const void* addr, size_t len) { #ifdef _WIN32 return VirtualLock(const_cast(addr), len) != 0; #else return mlock(addr, len) == 0; #endif } bool MemoryPageLocker::Unlock(const void* addr, size_t len) { #ifdef _WIN32 return VirtualUnlock(const_cast(addr), len) != 0; #else return munlock(addr, len) == 0; #endif } LockedPageManager::LockedPageManager() : LockedPageManagerBase(GetSystemPageSize()) { }