Prechádzať zdrojové kódy

* Fix mem leak (stack memory never freed) in wasm.

Michaël Van Canneyt 5 mesiacov pred
rodič
commit
2406b203be
2 zmenil súbory, kde vykonal 7 pridanie a 3 odobranie
  1. 1 1
      rtl/wasicommon/systhrd.inc
  2. 6 2
      rtl/wasicommon/tthread.inc

+ 1 - 1
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;

+ 6 - 2
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;