Browse Source

* simplify TThread.RemoveQueuedEvent - decide what to delete and not what to leave (better corresponds with the docs)

git-svn-id: trunk@47011 -
ondrej 4 years ago
parent
commit
192bbc07f5
1 changed files with 24 additions and 31 deletions
  1. 24 31
      rtl/objpas/classes/classes.inc

+ 24 - 31
rtl/objpas/classes/classes.inc

@@ -602,42 +602,35 @@ begin
     lastentry := Nil;
     lastentry := Nil;
     entry := ThreadQueueHead;
     entry := ThreadQueueHead;
     while Assigned(entry) do begin
     while Assigned(entry) do begin
-      { first check for the thread }
-      if Assigned(aThread) and (entry^.Thread <> aThread) and (entry^.ThreadID <> aThread.ThreadID) then begin
-        lastentry := entry;
-        entry := entry^.Next;
-        Continue;
-      end;
-      { then check for the method }
-      if Assigned(aMethod) and
+      if
+        { only entries not added by Synchronize }
+        not Assigned(entry^.SyncEvent)
+        { check for the thread }
+        and (not Assigned(aThread) or (entry^.Thread = aThread) or (entry^.ThreadID = aThread.ThreadID))
+        { check for the method }
+        and (not Assigned(aMethod) or
           (
           (
-            (TMethod(entry^.Method).Code <> TMethod(aMethod).Code) or
-            (TMethod(entry^.Method).Data <> TMethod(aMethod).Data)
-          ) then begin
-        lastentry := entry;
+            (TMethod(entry^.Method).Code = TMethod(aMethod).Code) and
+            (TMethod(entry^.Method).Data = TMethod(aMethod).Data)
+          ))
+      then begin
+        { ok, we need to remove this entry }
+        tmpentry := entry;
+        if Assigned(lastentry) then
+          lastentry^.Next := entry^.Next;
         entry := entry^.Next;
         entry := entry^.Next;
-        Continue;
-      end;
-      { skip entries added by Synchronize }
-      if Assigned(entry^.SyncEvent) then begin
+        if ThreadQueueHead = tmpentry then
+          ThreadQueueHead := entry;
+        if ThreadQueueTail = tmpentry then
+          ThreadQueueTail := lastentry;
+        { only dispose events added by Queue }
+        if not Assigned(tmpentry^.SyncEvent) then
+          Dispose(tmpentry);
+      end else begin
+        { leave this entry }
         lastentry := entry;
         lastentry := entry;
         entry := entry^.Next;
         entry := entry^.Next;
-        Continue;
       end;
       end;
-
-      { ok, we need to remove this entry }
-
-      tmpentry := entry;
-      if Assigned(lastentry) then
-        lastentry^.Next := entry^.Next;
-      entry := entry^.Next;
-      if ThreadQueueHead = tmpentry then
-        ThreadQueueHead := entry;
-      if ThreadQueueTail = tmpentry then
-        ThreadQueueTail := lastentry;
-      { only dispose events added by Queue }
-      if not Assigned(tmpentry^.SyncEvent) then
-        Dispose(tmpentry);
     end;
     end;
 {$ifdef FPC_HAS_FEATURE_THREADING}
 {$ifdef FPC_HAS_FEATURE_THREADING}
   finally
   finally