]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Remove some explicit yields in tasking run-time
authorRonan Desplanques <desplanques@adacore.com>
Tue, 2 Apr 2024 07:09:31 +0000 (09:09 +0200)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 21 May 2024 07:26:47 +0000 (09:26 +0200)
This patch removes three occurrences where tasking run-time
subprograms yielded control shortly before conditional calls to Sleep,
in order to avoid these calls more often. It was intended as an
optimization on systems where calls to Sleep are costly and in
particular VMS.

A problem was that two of the yields contained data races that were
reported by thread sanitizing tools on some platforms, and that's the
motivation for removing them.

gcc/ada/

* libgnarl/s-taenca.adb (Wait_For_Completion): Remove call to
Yield.
* libgnarl/s-tasren.adb (Timed_Selective_Wait, Wait_For_Call):
Remove calls to Yield.

gcc/ada/libgnarl/s-taenca.adb
gcc/ada/libgnarl/s-tasren.adb

index cd9c53b19fe9517c130d98416ca84ebe3af88f6e..1dc8ec518bdc6c9807b8e1ee4bfc384aec1aab8e 100644 (file)
@@ -410,18 +410,6 @@ package body System.Tasking.Entry_Calls is
 
       Self_Id.Common.State := Entry_Caller_Sleep;
 
-      --  Try to remove calls to Sleep in the loop below by letting the caller
-      --  a chance of getting ready immediately, using Unlock & Yield.
-      --  See similar action in Wait_For_Call & Timed_Selective_Wait.
-
-      STPO.Unlock (Self_Id);
-
-      if Entry_Call.State < Done then
-         STPO.Yield;
-      end if;
-
-      STPO.Write_Lock (Self_Id);
-
       loop
          Check_Pending_Actions_For_Entry_Call (Self_Id, Entry_Call);
 
index d65b9f011b052577e59dca6a07aac0b5ebbb889c..6face7ef8d400ac2a6cc9f9fc9625e8bf3b2ec85 100644 (file)
@@ -1317,18 +1317,6 @@ package body System.Tasking.Rendezvous is
 
             Self_Id.Common.State := Acceptor_Delay_Sleep;
 
-            --  Try to remove calls to Sleep in the loop below by letting the
-            --  caller a chance of getting ready immediately, using Unlock
-            --  Yield. See similar action in Wait_For_Completion/Wait_For_Call.
-
-            Unlock (Self_Id);
-
-            if Self_Id.Open_Accepts /= null then
-               Yield;
-            end if;
-
-            Write_Lock (Self_Id);
-
             --  Check if this task has been aborted while the lock was released
 
             if Self_Id.Pending_ATC_Level < Self_Id.ATC_Nesting_Level then
@@ -1510,18 +1498,6 @@ package body System.Tasking.Rendezvous is
    begin
       Self_Id.Common.State := Acceptor_Sleep;
 
-      --  Try to remove calls to Sleep in the loop below by letting the caller
-      --  a chance of getting ready immediately, using Unlock & Yield.
-      --  See similar action in Wait_For_Completion & Timed_Selective_Wait.
-
-      Unlock (Self_Id);
-
-      if Self_Id.Open_Accepts /= null then
-         Yield;
-      end if;
-
-      Write_Lock (Self_Id);
-
       --  Check if this task has been aborted while the lock was released
 
       if Self_Id.Pending_ATC_Level < Self_Id.ATC_Nesting_Level then