Browse Source

* WebAssembly threads: protect SysOSAlloc against race conditions via a critical section

Nikolay Nikolov 1 year ago
parent
commit
7681c192db
2 changed files with 14 additions and 0 deletions
  1. 12 0
      rtl/wasi/sysheap.inc
  2. 2 0
      rtl/wasi/systhrd.inc

+ 12 - 0
rtl/wasi/sysheap.inc

@@ -26,6 +26,10 @@ const
 var
   InitialHeapBlockStart: Pointer;
   InitialHeapBlockEnd: Pointer;
+{$ifdef FPC_WASM_THREADS}
+  InitialHeapCriticalSection: TRtlCriticalSection;
+  InitialHeapCriticalSectionInitialized: Boolean = false;
+{$endif FPC_WASM_THREADS}
 
 procedure SetInitialHeapBlockStart(p: Pointer);[Public, Alias : 'FPC_WASM_SETINITIALHEAPBLOCKSTART'];
 begin
@@ -43,6 +47,10 @@ const
 var
   res: ptruint;
 begin
+{$ifdef FPC_WASM_THREADS}
+  if InitialHeapCriticalSectionInitialized then
+    EnterCriticalSection(InitialHeapCriticalSection);
+{$endif FPC_WASM_THREADS}
   if (PtrUInt(InitialHeapBlockEnd)-PtrUInt(InitialHeapBlockStart))>=size then
     begin
       SysOSAlloc:=InitialHeapBlockStart;
@@ -56,6 +64,10 @@ begin
       else
         SysOSAlloc:=nil;
     end;
+{$ifdef FPC_WASM_THREADS}
+  if InitialHeapCriticalSectionInitialized then
+    LeaveCriticalSection(InitialHeapCriticalSection);
+{$endif FPC_WASM_THREADS}
 end;
 
 procedure SysOSFree(p: pointer; size: ptruint);

+ 2 - 0
rtl/wasi/systhrd.inc

@@ -121,6 +121,8 @@ begin
 {$ELSE FPC_WASM_MAIN_THREAD_CAN_WAIT}
   GlobalIsThreadBlockable:=0;
 {$ENDIF FPC_WASM_MAIN_THREAD_CAN_WAIT}
+  InitMutex(TWasmMutex(InitialHeapCriticalSection));
+  InitialHeapCriticalSectionInitialized:=true;
   if TLSInfoBlock=Nil then
     TLSInfoBlock:=AllocateOSInfoBlock;
 {$IFDEF DEBUGWASMTHREADS}