MCPcopy Create free account
hub / github.com/LUX-Core/lux / allocLargePagesMemory

Function allocLargePagesMemory

src/crypto/RandomX/virtual_memory.cpp:133–158  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

131}
132
133void* allocLargePagesMemory(std::size_t bytes) {
134 void* mem;
135#if defined(_WIN32) || defined(__CYGWIN__)
136 setPrivilege("SeLockMemoryPrivilege", 1);
137 auto pageMinimum = GetLargePageMinimum();
138 if (pageMinimum > 0)
139 mem = VirtualAlloc(NULL, alignSize(bytes, pageMinimum), MEM_COMMIT | MEM_RESERVE | MEM_LARGE_PAGES, PAGE_READWRITE);
140 else
141 throw std::runtime_error("allocLargePagesMemory - Large pages are not supported");
142 if (mem == nullptr)
143 throw std::runtime_error(getErrorMessage("allocLargePagesMemory - VirtualAlloc"));
144#else
145#ifdef __APPLE__
146 mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, VM_FLAGS_SUPERPAGE_SIZE_2MB, 0);
147#elif defined(__FreeBSD__)
148 mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER, -1, 0);
149#elif defined(__OpenBSD__) || defined(__NetBSD__)
150 mem = MAP_FAILED; // OpenBSD does not support huge pages
151#else
152 mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_POPULATE, -1, 0);
153#endif
154 if (mem == MAP_FAILED)
155 throw std::runtime_error("allocLargePagesMemory - mmap failed");
156#endif
157 return mem;
158}
159
160void freePagedMemory(void* ptr, std::size_t bytes) {
161#if defined(_WIN32) || defined(__CYGWIN__)

Callers 1

allocMemoryMethod · 0.85

Calls 4

setPrivilegeFunction · 0.85
alignSizeFunction · 0.85
getErrorMessageFunction · 0.85
mmapFunction · 0.85

Tested by

no test coverage detected