diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2015-03-20 12:30:27 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2015-03-20 12:30:29 +0100 |
commit | 3811a5025ebc48fbbed30178d645872e3b543068 (patch) | |
tree | caf6765dd0a9455891f14d2df42f164b56cfba13 /src/support/pagelocker.cpp | |
parent | c7abfa595dda5b74b0386532dc6a685ab1c7f009 (diff) | |
parent | d7d187e8a451ae946fa14cead7962edbe0046f12 (diff) |
Merge #5810: MOVEONLY-ISH: allocators: split allocators and pagelocker
d7d187e allocators: split allocators and pagelocker (Cory Fields)
Diffstat (limited to 'src/support/pagelocker.cpp')
-rw-r--r-- | src/support/pagelocker.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/support/pagelocker.cpp b/src/support/pagelocker.cpp new file mode 100644 index 0000000000..440e0a5193 --- /dev/null +++ b/src/support/pagelocker.cpp @@ -0,0 +1,70 @@ +// Copyright (c) 2009-2013 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#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 <windows.h> +// 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 <sys/mman.h> +#include <limits.h> // for PAGESIZE +#include <unistd.h> // 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<void*>(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<void*>(addr), len) != 0; +#else + return munlock(addr, len) == 0; +#endif +} + +LockedPageManager::LockedPageManager() : LockedPageManagerBase<MemoryPageLocker>(GetSystemPageSize()) +{ +} |