Make allocation of virtmem regions thread-safe

This commit is contained in:
plutoo 2018-01-01 22:35:54 +01:00
parent 53a63d861a
commit 5739fda64a

View File

@ -16,6 +16,7 @@ static VirtualRegion g_AddressSpace;
static VirtualRegion g_Region[REGION_MAX]; static VirtualRegion g_Region[REGION_MAX];
static u64 g_CurrentAddr; static u64 g_CurrentAddr;
static u64 g_CurrentMapAddr; static u64 g_CurrentMapAddr;
static Mutex g_VirtMemMutex;
static Result _GetRegionFromInfo(VirtualRegion* r, u64 id0_addr, u32 id0_sz) { static Result _GetRegionFromInfo(VirtualRegion* r, u64 id0_addr, u32 id0_sz) {
u64 base; u64 base;
@ -67,7 +68,9 @@ void* virtmemReserve(size_t size) {
size = (size + 0xFFF) &~ 0xFFF; size = (size + 0xFFF) &~ 0xFFF;
mutexLock(&g_VirtMemMutex);
u64 addr = g_CurrentAddr; u64 addr = g_CurrentAddr;
while (1) while (1)
{ {
// Add a guard page. // Add a guard page.
@ -121,6 +124,8 @@ void* virtmemReserve(size_t size) {
} }
g_CurrentAddr = addr + size; g_CurrentAddr = addr + size;
mutexUnlock(&g_VirtMemMutex);
return (void*) addr; return (void*) addr;
} }
@ -135,11 +140,12 @@ void* virtmemReserveMap(size_t size)
MemInfo meminfo; MemInfo meminfo;
u32 pageinfo; u32 pageinfo;
int region_idx = kernelAbove200() ? REGION_NEW_STACK : REGION_STACK;
size = (size + 0xFFF) &~ 0xFFF; size = (size + 0xFFF) &~ 0xFFF;
int region_idx = kernelAbove200() ? REGION_NEW_STACK : REGION_STACK; mutexLock(&g_VirtMemMutex);
u64 addr = g_CurrentMapAddr; u64 addr = g_CurrentMapAddr;
while (1) while (1)
{ {
// Add a guard page. // Add a guard page.
@ -173,6 +179,8 @@ void* virtmemReserveMap(size_t size)
} }
g_CurrentMapAddr = addr + size; g_CurrentMapAddr = addr + size;
mutexUnlock(&g_VirtMemMutex);
return (void*) addr; return (void*) addr;
} }