aboutsummaryrefslogtreecommitdiff
path: root/src/allocators.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2013-10-09 16:45:59 +1000
committerGavin Andresen <gavinandresen@gmail.com>2013-10-09 16:48:53 +1000
commitd8315d1650373e6609cfda921160fd51f6608a99 (patch)
tree70a5dcccf893486bbd69dc4357021310a9d6bdb0 /src/allocators.cpp
parent26002aa444d4ee4986d623e0ad45cca02e803bc5 (diff)
downloadbitcoin-d8315d1650373e6609cfda921160fd51f6608a99.tar.xz
Remove include of windows.h from allocators.h
Create an allocators.cpp, and move all of the #ifdef WIN32 code and the #include of windows.h into it. Two motives for this cleanup: 1. I'm getting a weird error in windows.h in my smartfee branch. 2. allocators.h is included (indirectly) just about everywhere, so this should speed up Windows compiles quite a lot.
Diffstat (limited to 'src/allocators.cpp')
-rw-r--r--src/allocators.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/allocators.cpp b/src/allocators.cpp
new file mode 100644
index 0000000000..b239b623d8
--- /dev/null
+++ b/src/allocators.cpp
@@ -0,0 +1,64 @@
+// Copyright (c) 2009-2013 The Bitcoin developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "allocators.h"
+
+#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
+
+/** 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);
+#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);
+#else
+ return munlock(addr, len) == 0;
+#endif
+}
+
+LockedPageManager::LockedPageManager() : LockedPageManagerBase<MemoryPageLocker>(GetSystemPageSize())
+{
+}
+