3 #include "os/windows/windows.h"
5 #include <unordered_map>
7 #include <tbb/atomic.h>
9 namespace caspar { namespace detail {
12 std::unordered_map<void*, size_t> g_map;
15 void allocate_store(size_t size)
17 SIZE_T workingSetMinSize = 0, workingSetMaxSize = 0;
18 if(::GetProcessWorkingSetSize(::GetCurrentProcess(), &workingSetMinSize, &workingSetMaxSize))
20 workingSetMinSize += size;
21 workingSetMaxSize += size;
23 if(!::SetProcessWorkingSetSize(::GetCurrentProcess(), workingSetMinSize, workingSetMaxSize))
24 throw std::bad_alloc();
30 void* alloc_page_locked(size_t size)
32 tbb::mutex::scoped_lock lock(g_mutex);
37 auto p = ::VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
39 throw std::bad_alloc();
41 if(::VirtualLock(p, size) == 0)
43 ::VirtualFree(p, 0, MEM_RELEASE);
44 throw std::bad_alloc();
53 void free_page_locked(void* p)
55 tbb::mutex::scoped_lock lock(g_mutex);
57 if(g_map.find(p) == g_map.end())
60 ::VirtualFree(p, 0, MEM_RELEASE);