Browse Source

‘LockCount’ does not require atomics.

Rika Ichinose 1 year ago
parent
commit
54bb95da81
1 changed files with 15 additions and 23 deletions
  1. 15 23
      packages/rtl-objpas/src/inc/fpmonitor.pp

+ 15 - 23
packages/rtl-objpas/src/inc/fpmonitor.pp

@@ -165,7 +165,6 @@ end;
 
 
 procedure TMonitorData.Enter;
 procedure TMonitorData.Enter;
 var
 var
-  I : integer;
   TID : TThreadID;
   TID : TThreadID;
   IsOwner : Boolean;
   IsOwner : Boolean;
 
 
@@ -175,18 +174,16 @@ begin
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Begin enter. Is Owner: ',IsOwner);{$ENDIF}
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Begin enter. Is Owner: ',IsOwner);{$ENDIF}
   if IsOwner then
   if IsOwner then
     begin
     begin
-    I:=AtomicIncrement(LockCount);
-    if I<>1 then
-      begin
-      {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Recursive enter detected');{$ENDIF}
-      exit;
-      end;
+    {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Recursive enter detected');{$ENDIF}
+    end
+  else
+    begin
+    {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Entering critical section');{$ENDIF}
+    EnterCriticalSection(CriticalSection);
+    LockOwnerThreadID:=TID;
+    {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Entered critical section');{$ENDIF}
     end;
     end;
-  {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Entering critical section');{$ENDIF}
-  EnterCriticalSection(CriticalSection);
-  LockCount:=1;
-  LockOwnerThreadID:=TID;
-  {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Entered critical section');{$ENDIF}
+  Inc(LockCount);
 end;
 end;
 
 
 function TMonitorData.TryEnter: Boolean;
 function TMonitorData.TryEnter: Boolean;
@@ -196,15 +193,14 @@ begin
   TID:=GetCurrentThreadId;
   TID:=GetCurrentThreadId;
   Result:=TID=LockOwnerThreadID;
   Result:=TID=LockOwnerThreadID;
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Begin TryEnter. Is Owner: ',Result);{$ENDIF}
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Begin TryEnter. Is Owner: ',Result);{$ENDIF}
-  if Not Result then
+  if not Result then
     begin
     begin
     Result:=TryEnterCriticalSection(CriticalSection)<>0;
     Result:=TryEnterCriticalSection(CriticalSection)<>0;
     if Result then
     if Result then
-      begin
       LockOwnerThreadID:=TID;
       LockOwnerThreadID:=TID;
-      LockCount:=1;
-      end;
     end;
     end;
+  if Result then
+    Inc(LockCount);
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' End TryEnter. Result: ',Result);{$ENDIF}
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' End TryEnter. Result: ',Result);{$ENDIF}
 end;
 end;
 
 
@@ -314,19 +310,15 @@ end;
 
 
 procedure TMonitorData.Leave;
 procedure TMonitorData.Leave;
 
 
-var
-  I : integer;
-
 begin
 begin
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Begin Leave. Is owner: ',GetCurrentThreadID=LockOwnerThreadID);{$ENDIF}
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Begin Leave. Is owner: ',GetCurrentThreadID=LockOwnerThreadID);{$ENDIF}
   CheckLockOwner;
   CheckLockOwner;
-  I:=AtomicDecrement(LockCount);
-  {$IFDEF DEBUG_MONITOR}if I>0 then Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Owner holds recursive lock: ',I);{$ENDIF}
-  if I<>0 then
+  Dec(LockCount);
+  {$IFDEF DEBUG_MONITOR}if LockCount>0 then Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Owner holds recursive lock: ',LockCount);{$ENDIF}
+  if LockCount<>0 then
     Exit;
     Exit;
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Leaving critical section');{$ENDIF}
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' Leaving critical section');{$ENDIF}
   LockOwnerThreadID:=TThreadID(0);
   LockOwnerThreadID:=TThreadID(0);
-  LockCount:=0;
   LeaveCriticalSection(CriticalSection);
   LeaveCriticalSection(CriticalSection);
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' End Leave. Is owner: ',GetCurrentThreadID=LockOwnerThreadID);{$ENDIF}
   {$IFDEF DEBUG_MONITOR}Writeln(StdErr,GetTickCount64,': Thread ',GetCurrentThreadId,' End Leave. Is owner: ',GetCurrentThreadID=LockOwnerThreadID);{$ENDIF}
 end;
 end;