Browse Source

+ WebAssembly threads: spinwait until ThreadHasFinished becomes true in
WasiWaitForThreadTerminate, before freeing the thread TLS and stack block, to
avoid race condition with a thread that is finishing (i.e. the main threadproc
is done), but still executing internal Pascal code inside
FPCWasmThreadStartPascal.

Nikolay Nikolov 11 months ago
parent
commit
a0ac317aae
1 changed files with 3 additions and 0 deletions
  1. 3 0
      rtl/wasi/systhrd.inc

+ 3 - 0
rtl/wasi/systhrd.inc

@@ -587,6 +587,9 @@ begin
   UnLockMuTex(PWasmThread(ThreadHandle)^.Running);
   {$IFDEF DEBUGWASMTHREADS}DebugWriteln('WaitForThreadTerminate('+IntToStr(PtrUINT(TH))+') : Lock released');{$ENDIF}
   WasiWaitForThreadTerminate:=DWord(Res);
+  {$IFDEF DEBUGWASMTHREADS}DebugWriteln('WaitForThreadTerminate('+IntToStr(PtrUINT(TH))+') : Waiting until ThreadHasFinished becomes true');{$ENDIF}
+  repeat
+  until fpc_wasm32_i32_atomic_load8_u(@P^.ThreadHasFinished)<>0;
   {$IFDEF DEBUGWASMTHREADS}DebugWriteln('WaitForThreadTerminate('+IntToStr(PtrUINT(TH))+') : FreeStackAndTlsBlock');{$ENDIF}
   FreeStackAndTlsBlock(TH);
 end;