diff --git a/Utilities/VirtualMemory.cpp b/Utilities/VirtualMemory.cpp index 88e0774938..23fed38db4 100644 --- a/Utilities/VirtualMemory.cpp +++ b/Utilities/VirtualMemory.cpp @@ -80,7 +80,7 @@ namespace utils #ifdef _WIN32 verify(HERE), ::VirtualAlloc(pointer, size, MEM_COMMIT, +prot); #else - verify(HERE), ::mprotect((void*)((u64)pointer & -4096), ::align(size, 4096), +prot) != -1; + verify(HERE), ::mprotect((void*)((u64)pointer & -4096), size + ((u64)pointer & 4095), +prot) != -1; #endif } @@ -93,6 +93,16 @@ namespace utils #endif } + void memory_reset(void* pointer, std::size_t size, protection prot) + { +#ifdef _WIN32 + memory_decommit(pointer, size); + memory_commit(pointer, size, prot); +#else + verify(HERE), ::mmap(pointer, size, +prot, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); +#endif + } + void memory_release(void* pointer, std::size_t size) { #ifdef _WIN32 @@ -120,7 +130,7 @@ namespace utils addr += block_size; } #else - verify(HERE), ::mprotect((void*)((u64)pointer & -4096), ::align(size, 4096), +prot) != -1; + verify(HERE), ::mprotect((void*)((u64)pointer & -4096), size + ((u64)pointer & 4095), +prot) != -1; #endif } diff --git a/Utilities/VirtualMemory.h b/Utilities/VirtualMemory.h index f6fd0df133..4618baf012 100644 --- a/Utilities/VirtualMemory.h +++ b/Utilities/VirtualMemory.h @@ -25,11 +25,12 @@ namespace utils */ void memory_commit(void* pointer, std::size_t size, protection prot = protection::rw); - /** - * Decommit all memory committed via commit_page_memory. - */ + // Decommit all memory committed via commit_page_memory. void memory_decommit(void* pointer, std::size_t size); + // Decommit all memory and commit it again. + void memory_reset(void* pointer, std::size_t size, protection prot = protection::rw); + // Free memory after reserved by memory_reserve, should specify original size void memory_release(void* pointer, std::size_t size);