text: // Copyright (c) 2014-2015 The Dacrs developers
  // Copyright (c) 2016 The Tongxingpoints 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
  
  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);
  #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())
  {
  }
  
  