diff --git a/rtl/wasicommon/systhrd.inc b/rtl/wasicommon/systhrd.inc index 946ad943e5..d55a90755a 100644 --- a/rtl/wasicommon/systhrd.inc +++ b/rtl/wasicommon/systhrd.inc @@ -562,6 +562,7 @@ end; function WasiCloseThread(threadHandle : TThreadID) : dword; begin + FreeStackAndTlsBlock(PWasmThread(threadhandle)); Result:=0; end; @@ -599,7 +600,6 @@ begin repeat until fpc_wasm32_i32_atomic_load8_u(@TH^.ThreadHasFinished)<>0; {$IFDEF DEBUGWASMTHREADS}DebugWriteln('WaitForThreadTerminate('+IntToStr(PtrUINT(TH))+') : FreeStackAndTlsBlock');{$ENDIF} - FreeStackAndTlsBlock(TH); end; function WasiThreadSetPriority(threadHandle : TThreadID; Prio: longint): boolean; diff --git a/rtl/wasicommon/tthread.inc b/rtl/wasicommon/tthread.inc index 601889ff06..c8068eeacd 100644 --- a/rtl/wasicommon/tthread.inc +++ b/rtl/wasicommon/tthread.inc @@ -113,9 +113,10 @@ begin {$IFDEF DEBUGWASMTHREADS}DebugWriteln('Thread '+IntToStr(ptruint(lthread))+' should be freed');{$ENDIF} LThread.Free; {$IFDEF DEBUGWASMTHREADS}DebugWriteln('Thread freed');{$ENDIF} - {$IFDEF DEBUGWASMTHREADS}DebugWriteln('Thread func calling EndThread');{$ENDIF} - EndThread(Result); end; + {$IFDEF DEBUGWASMTHREADS}DebugWriteln('Thread func calling EndThread');{$ENDIF} + EndThread(Result); + end; procedure TThread.SysCreate(CreateSuspended: Boolean; const StackSize: SizeUInt); @@ -195,6 +196,9 @@ begin {$IFDEF DEBUGWASMTHREADS}DebugWriteln('TThread.SysDestroy: freeing fatal exception if it exists');{$ENDIF} FFatalException.Free; FFatalException := nil; + // Free resources associated with thread. + // This must be done after EndThread is called, but that is called in ThreadFunc + CloseThread(FHandle); end;