Browse Source

* Patch from Amexander Bagel to restore Delphi-compatible behaviour in TThread.Queue. Fixes issue #41043

Michaël Van Canneyt 8 months ago
parent
commit
6f5f567087
2 changed files with 1 additions and 17 deletions
  1. 1 16
      rtl/objpas/classes/classes.inc
  2. 0 1
      rtl/objpas/classes/classesh.inc

+ 1 - 16
rtl/objpas/classes/classes.inc

@@ -413,7 +413,6 @@ procedure TThread.InitSynchronizeEvent;
     New(FSynchronizeEntry);
     New(FSynchronizeEntry);
     FillChar(FSynchronizeEntry^, SizeOf(TThreadQueueEntry), 0);
     FillChar(FSynchronizeEntry^, SizeOf(TThreadQueueEntry), 0);
     FSynchronizeEntry^.Thread := Self;
     FSynchronizeEntry^.Thread := Self;
-    FSynchronizeEntry^.ThreadID := ThreadID;
 {$ifdef FPC_HAS_FEATURE_THREADING}
 {$ifdef FPC_HAS_FEATURE_THREADING}
     FSynchronizeEntry^.SyncEvent := RtlEventCreate;
     FSynchronizeEntry^.SyncEvent := RtlEventCreate;
 {$else}
 {$else}
@@ -461,10 +460,8 @@ class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);
       New(syncentry);
       New(syncentry);
       FillChar(syncentry^, SizeOf(TThreadQueueEntry), 0);
       FillChar(syncentry^, SizeOf(TThreadQueueEntry), 0);
 {$ifdef FPC_HAS_FEATURE_THREADING}
 {$ifdef FPC_HAS_FEATURE_THREADING}
-      syncentry^.ThreadID := GetCurrentThreadID;
       syncentry^.SyncEvent := RtlEventCreate;
       syncentry^.SyncEvent := RtlEventCreate;
 {$else}
 {$else}
-      syncentry^.ThreadID := 0{GetCurrentThreadID};
       syncentry^.SyncEvent := nil{RtlEventCreate};
       syncentry^.SyncEvent := nil{RtlEventCreate};
 {$endif}
 {$endif}
     end;
     end;
@@ -515,10 +512,8 @@ class procedure TThread.Synchronize(AThread: TThread; AProcedure: TThreadProcedu
       New(syncentry);
       New(syncentry);
       FillChar(syncentry^, SizeOf(TThreadQueueEntry), 0);
       FillChar(syncentry^, SizeOf(TThreadQueueEntry), 0);
 {$ifdef FPC_HAS_FEATURE_THREADING}
 {$ifdef FPC_HAS_FEATURE_THREADING}
-      syncentry^.ThreadID := GetCurrentThreadID;
       syncentry^.SyncEvent := RtlEventCreate;
       syncentry^.SyncEvent := RtlEventCreate;
 {$else}
 {$else}
-      syncentry^.ThreadID := 0{GetCurrentThreadID};
       syncentry^.SyncEvent := nil{RtlEventCreate};
       syncentry^.SyncEvent := nil{RtlEventCreate};
 {$endif}
 {$endif}
     end;
     end;
@@ -688,11 +683,6 @@ begin
   New(queueentry);
   New(queueentry);
   FillChar(queueentry^, SizeOf(TThreadQueueEntry), 0);
   FillChar(queueentry^, SizeOf(TThreadQueueEntry), 0);
   queueentry^.Thread := aThread;
   queueentry^.Thread := aThread;
-{$ifdef FPC_HAS_FEATURE_THREADING}
-  queueentry^.ThreadID := GetCurrentThreadID;
-{$else}
-  queueentry^.ThreadID := 0{GetCurrentThreadID};
-{$endif}
   queueentry^.Method := aMethod;
   queueentry^.Method := aMethod;
 
 
   { the queueentry is freed by CheckSynchronize (or by RemoveQueuedEvents) }
   { the queueentry is freed by CheckSynchronize (or by RemoveQueuedEvents) }
@@ -707,11 +697,6 @@ begin
   New(queueentry);
   New(queueentry);
   FillChar(queueentry^, SizeOf(TThreadQueueEntry), 0);
   FillChar(queueentry^, SizeOf(TThreadQueueEntry), 0);
   queueentry^.Thread := aThread;
   queueentry^.Thread := aThread;
-{$ifdef FPC_HAS_FEATURE_THREADING}
-  queueentry^.ThreadID := GetCurrentThreadID;
-{$else}
-  queueentry^.ThreadID := 0{GetCurrentThreadID};
-{$endif}
   queueentry^.ThreadProc := aProcedure;
   queueentry^.ThreadProc := aProcedure;
 
 
   { the queueentry is freed by CheckSynchronize (or by RemoveQueuedEvents) }
   { the queueentry is freed by CheckSynchronize (or by RemoveQueuedEvents) }
@@ -756,7 +741,7 @@ begin
         { only entries not added by Synchronize }
         { only entries not added by Synchronize }
         not Assigned(entry^.SyncEvent)
         not Assigned(entry^.SyncEvent)
         { check for the thread }
         { check for the thread }
-        and (not Assigned(aThread) or (entry^.Thread = aThread) or (entry^.ThreadID = aThread.ThreadID))
+        and (not Assigned(aThread) or (entry^.Thread = aThread))
         { check for the method }
         { check for the method }
         and (not Assigned(aMethod) or
         and (not Assigned(aMethod) or
           (
           (

+ 0 - 1
rtl/objpas/classes/classesh.inc

@@ -2253,7 +2253,6 @@ type
       ThreadProc: TThreadProcedure;
       ThreadProc: TThreadProcedure;
 {$endif}
 {$endif}
       Thread: TThread;
       Thread: TThread;
-      ThreadID: TThreadID;
       Exception: TObject;
       Exception: TObject;
       SyncEvent: PRtlEvent;
       SyncEvent: PRtlEvent;
       Next: PThreadQueueEntry;
       Next: PThreadQueueEntry;