[Ada] Make Max_Sensible_Delay uniform across all Posix targets
authorDoug Rupp <rupp@adacore.com>
Fri, 25 May 2018 09:03:47 +0000 (09:03 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 25 May 2018 09:03:47 +0000 (09:03 +0000)
For instance: 6 months where Duration is 64bits.  Heretofore LynxOS was unique
in having an approximately 12 days max delay. By experimentation the actual
maximum was determined and all relevant delay and sleep procedures rewritten to
incrementally wait if necessary.

2018-05-25  Doug Rupp  <rupp@adacore.com>

gcc/ada/

* libgnarl/s-osinte__aix.ads, libgnarl/s-osinte__android.ads,
libgnarl/s-osinte__darwin.ads, libgnarl/s-osinte__freebsd.ads,
libgnarl/s-osinte__hpux.ads, libgnarl/s-osinte__kfreebsd-gnu.ads,
libgnarl/s-osinte__linux.ads, libgnarl/s-osinte__lynxos178e.ads,
libgnarl/s-osinte__qnx.ads, libgnarl/s-osinte__rtems.ads
(Relative_Timed_Wait): Remove.
* libgnarl/s-tpopmo.adb (Timed_Sleep, Timed_Delay): Rewrite to allow
for incremental looping. Remove references to Rel_Time and
Relative_Timed_Wait.
* libgnat/s-osprim__posix.adb, libgnat/s-osprim__posix2008.adb
(Timed_Delay): Make separate.
* libgnat/s-optide.adb: New separate procedure.
* libgnat/s-osprim.ads (Max_System_Delay): New constant.
* libgnat/s-osprim__lynxos.ads (Max_Sensible_Delay): Set to 6 months.
(Max_System_Delay): New constant.

From-SVN: r260724

17 files changed:
gcc/ada/ChangeLog
gcc/ada/libgnarl/s-osinte__aix.ads
gcc/ada/libgnarl/s-osinte__android.ads
gcc/ada/libgnarl/s-osinte__darwin.ads
gcc/ada/libgnarl/s-osinte__freebsd.ads
gcc/ada/libgnarl/s-osinte__hpux.ads
gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads
gcc/ada/libgnarl/s-osinte__linux.ads
gcc/ada/libgnarl/s-osinte__lynxos178e.ads
gcc/ada/libgnarl/s-osinte__qnx.ads
gcc/ada/libgnarl/s-osinte__rtems.ads
gcc/ada/libgnarl/s-tpopmo.adb
gcc/ada/libgnat/s-optide.adb [new file with mode: 0644]
gcc/ada/libgnat/s-osprim.ads
gcc/ada/libgnat/s-osprim__lynxos.ads
gcc/ada/libgnat/s-osprim__posix.adb
gcc/ada/libgnat/s-osprim__posix2008.adb

index adb62f5b3c5a3188e13798e2fd8924ebf5df9dc5..6f261dba21b0506d85d3d4a1e108782306858396 100644 (file)
@@ -1,3 +1,21 @@
+2018-05-25  Doug Rupp  <rupp@adacore.com>
+
+       * libgnarl/s-osinte__aix.ads, libgnarl/s-osinte__android.ads,
+       libgnarl/s-osinte__darwin.ads, libgnarl/s-osinte__freebsd.ads,
+       libgnarl/s-osinte__hpux.ads, libgnarl/s-osinte__kfreebsd-gnu.ads,
+       libgnarl/s-osinte__linux.ads, libgnarl/s-osinte__lynxos178e.ads,
+       libgnarl/s-osinte__qnx.ads, libgnarl/s-osinte__rtems.ads
+       (Relative_Timed_Wait): Remove.
+       * libgnarl/s-tpopmo.adb (Timed_Sleep, Timed_Delay): Rewrite to allow
+       for incremental looping. Remove references to Rel_Time and
+       Relative_Timed_Wait.
+       * libgnat/s-osprim__posix.adb, libgnat/s-osprim__posix2008.adb
+       (Timed_Delay): Make separate.
+       * libgnat/s-optide.adb: New separate procedure.
+       * libgnat/s-osprim.ads (Max_System_Delay): New constant.
+       * libgnat/s-osprim__lynxos.ads (Max_Sensible_Delay): Set to 6 months.
+       (Max_System_Delay): New constant.
+
 2018-05-25  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch12.adb (Validate_Derived_Type_Instance): Verify that the actual
index a0bee29a6b139320fe00de66095ca2779f6dde2c..928be3201f5f131af3294199201f151fd437783d 100644 (file)
@@ -420,9 +420,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 98257172fe6f5df2ae0ace53ab9503215deee2da..2185734f96ae302ae8c6ff61503d1393bfb223d0 100644 (file)
@@ -414,9 +414,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 9bb2389e3dd60bfdf2920119f97dfbb0a362b95e..0f9b15206f5297b31dcf1bf1dabc87e55f9f956f 100644 (file)
@@ -397,9 +397,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 31a7a987249038db2d1a32d5432725e414431955..3380e2f9bd060f989d593a9c44a675dedc7abd04 100644 (file)
@@ -431,9 +431,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 4b05c582e8ecb8cfecb6e95b7a1ef264e006e617..db5f03cd12050795498a27d8633184e54947f6b1 100644 (file)
@@ -400,9 +400,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 754f6ee44542f2f333b4515467403de6a89cb6c1..408187314995038d37fc8bd3be26d7bf8e73a45d 100644 (file)
@@ -430,9 +430,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 5bf4a5fe1d26d598a73ae91c885316583957c67f..447f9b59624c4cd4c619bdf5506ae7616a2ba11b 100644 (file)
@@ -448,9 +448,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 20d983cabd7257f9ec87d26b21a342a6123901f9..5193a35785e0bb646e741ae63ef12667bb067c32 100644 (file)
@@ -420,9 +420,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index 36655a92b9ba540ee81f91201f08a5e21335352c..b1d077be44cb6baf699b0e9eb8166a12c2eaf8a0 100644 (file)
@@ -417,9 +417,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index ab061be6a547c208f03126c97edeea0c64e6fed3..c623c2e9cd1020b1b5c21de07a612f09e0421dc2 100644 (file)
@@ -426,9 +426,6 @@ package System.OS_Interface is
       abstime : access timespec) return int;
    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
 
-   Relative_Timed_Wait : constant Boolean := False;
-   --  pthread_cond_timedwait requires an absolute delay time
-
    --------------------------
    -- POSIX.1c  Section 13 --
    --------------------------
index f3ee54ac03a1a3546d43b39db929336840d30ba0..00411b24f8d00a9fb8ba5e653c7a0e76df9c6c15 100644 (file)
@@ -42,11 +42,10 @@ package body Monotonic is
      (Time       : Duration;
       Mode       : ST.Delay_Modes;
       Check_Time : out Duration;
-      Abs_Time   : out Duration;
-      Rel_Time   : out Duration);
+      Abs_Time   : out Duration);
    --  Helper for Timed_Sleep and Timed_Delay: given a deadline specified by
    --  Time and Mode, compute the current clock reading (Check_Time), and the
-   --  target absolute and relative clock readings (Abs_Time, Rel_Time). The
+   --  target absolute and relative clock readings (Abs_Time). The
    --  epoch for Time depends on Mode; the epoch for Check_Time and Abs_Time
    --  is always that of CLOCK_RT_Ada.
 
@@ -88,8 +87,7 @@ package body Monotonic is
      (Time       : Duration;
       Mode       : ST.Delay_Modes;
       Check_Time : out Duration;
-      Abs_Time   : out Duration;
-      Rel_Time   : out Duration)
+      Abs_Time   : out Duration)
    is
    begin
       Check_Time := Monotonic_Clock;
@@ -99,10 +97,6 @@ package body Monotonic is
       if Mode = Relative then
          Abs_Time := Duration'Min (Time, Max_Sensible_Delay) + Check_Time;
 
-         if Relative_Timed_Wait then
-            Rel_Time := Duration'Min (Max_Sensible_Delay, Time);
-         end if;
-
          pragma Warnings (Off);
          --  Comparison "OSC.CLOCK_RT_Ada = OSC.CLOCK_REALTIME" is compile
          --  time known.
@@ -115,10 +109,6 @@ package body Monotonic is
          pragma Warnings (On);
          Abs_Time := Duration'Min (Check_Time + Max_Sensible_Delay, Time);
 
-         if Relative_Timed_Wait then
-            Rel_Time := Duration'Min (Max_Sensible_Delay, Time - Check_Time);
-         end if;
-
       --  Absolute deadline specified using the calendar clock, in the
       --  case where it is not the same as the tasking clock: compensate for
       --  difference between clock epochs (Base_Time - Base_Cal_Time).
@@ -133,10 +123,6 @@ package body Monotonic is
             Abs_Time :=
               Duration'Min (Check_Time + Max_Sensible_Delay, RT_Time);
 
-            if Relative_Timed_Wait then
-               Rel_Time :=
-                 Duration'Min (Max_Sensible_Delay, RT_Time - Check_Time);
-            end if;
          end;
       end if;
    end Compute_Deadline;
@@ -162,10 +148,11 @@ package body Monotonic is
       Base_Time  : Duration;
       Check_Time : Duration;
       Abs_Time   : Duration;
-      Rel_Time   : Duration;
+      P_Abs_Time : Duration;
 
       Request    : aliased timespec;
       Result     : Interfaces.C.int;
+      Exit_Outer : Boolean := False;
 
    begin
       Timedout := True;
@@ -175,38 +162,63 @@ package body Monotonic is
         (Time       => Time,
          Mode       => Mode,
          Check_Time => Check_Time,
-         Abs_Time   => Abs_Time,
-         Rel_Time   => Rel_Time);
+         Abs_Time   => Abs_Time);
       Base_Time := Check_Time;
 
+      --  To keep a sensible Max_Sensible_Delay on a target whose system
+      --  maximum is less than sensible, we split the delay into manageable
+      --  chunks of time less than or equal to the Max_System_Delay.
+
       if Abs_Time > Check_Time then
-         Request :=
-           To_Timespec (if Relative_Timed_Wait then Rel_Time else Abs_Time);
 
-         loop
-            exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level;
+         Outer : loop
 
-            Result :=
-              pthread_cond_timedwait
-                (cond    => Self_ID.Common.LL.CV'Access,
-                 mutex   => (if Single_Lock
-                             then Single_RTS_Lock'Access
-                             else Self_ID.Common.LL.L'Access),
-                 abstime => Request'Access);
+            pragma Warnings (Off, "condition is always *");
+            if Max_System_Delay < Max_Sensible_Delay and then
+               Abs_Time > Check_Time + Max_System_Delay
+            then
+               P_Abs_Time := Check_Time + Max_System_Delay;
+            else
+               P_Abs_Time := Abs_Time;
+               Exit_Outer := True;
+            end if;
+            pragma Warnings (On);
 
-            Check_Time := Monotonic_Clock;
-            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
+            Request := To_Timespec (P_Abs_Time);
 
-            if Result in 0 | EINTR then
+            Inner : loop
+               exit Outer
+                  when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level;
 
-               --  Somebody may have called Wakeup for us
+               Result :=
+                 pthread_cond_timedwait
+                   (cond    => Self_ID.Common.LL.CV'Access,
+                    mutex   => (if Single_Lock
+                                then Single_RTS_Lock'Access
+                                else Self_ID.Common.LL.L'Access),
+                    abstime => Request'Access);
 
-               Timedout := False;
-               exit;
-            end if;
+               case Result is
+                  when 0 | EINTR =>
+                     --  Somebody may have called Wakeup for us
+                     Timedout := False;
+                     exit Outer;
 
-            pragma Assert (Result = ETIMEDOUT);
-         end loop;
+                  when ETIMEDOUT =>
+                     exit Outer when Exit_Outer;
+                     Check_Time := Monotonic_Clock;
+                     exit Inner;
+
+                  when others =>
+                     pragma Assert (False);
+
+               end case;
+
+               exit Outer
+                 when Abs_Time <= Check_Time or else Check_Time < Base_Time;
+
+            end loop Inner;
+         end loop Outer;
       end if;
    end Timed_Sleep;
 
@@ -225,11 +237,11 @@ package body Monotonic is
       Base_Time  : Duration;
       Check_Time : Duration;
       Abs_Time   : Duration;
-      Rel_Time   : Duration;
+      P_Abs_Time : Duration;
       Request    : aliased timespec;
 
-      Result : Interfaces.C.int;
-      pragma Warnings (Off, Result);
+      Result     : Interfaces.C.int;
+      Exit_Outer : Boolean := False;
 
    begin
       if Single_Lock then
@@ -242,31 +254,61 @@ package body Monotonic is
         (Time       => Time,
          Mode       => Mode,
          Check_Time => Check_Time,
-         Abs_Time   => Abs_Time,
-         Rel_Time   => Rel_Time);
+         Abs_Time   => Abs_Time);
       Base_Time := Check_Time;
 
+      --  To keep a sensible Max_Sensible_Delay on a target whose system
+      --  maximum is less than sensible, we split the delay into manageable
+      --  chunks of time less than or equal to the Max_System_Delay.
+
       if Abs_Time > Check_Time then
-         Request :=
-           To_Timespec (if Relative_Timed_Wait then Rel_Time else Abs_Time);
          Self_ID.Common.State := Delay_Sleep;
 
-         loop
-            exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level;
+         Outer : loop
+
+            pragma Warnings (Off, "condition is always *");
+            if Max_System_Delay < Max_Sensible_Delay and then
+              Abs_Time > Check_Time + Max_System_Delay
+            then
+               P_Abs_Time := Check_Time + Max_System_Delay;
+            else
+               P_Abs_Time := Abs_Time;
+               Exit_Outer := True;
+            end if;
+            pragma Warnings (On);
+
+            Request := To_Timespec (P_Abs_Time);
+
+            Inner : loop
+               exit Outer
+                 when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level;
+
+               Result :=
+                 pthread_cond_timedwait
+                   (cond    => Self_ID.Common.LL.CV'Access,
+                    mutex   => (if Single_Lock
+                                then Single_RTS_Lock'Access
+                                else Self_ID.Common.LL.L'Access),
+                    abstime => Request'Access);
+
+               case Result is
+                  when ETIMEDOUT =>
+                     exit Outer when Exit_Outer;
+                     Check_Time := Monotonic_Clock;
+                     exit Inner;
+
+                  when 0 | EINTR => null;
+
+                  when others =>
+                     pragma Assert (False);
 
-            Result :=
-              pthread_cond_timedwait
-                (cond    => Self_ID.Common.LL.CV'Access,
-                 mutex   => (if Single_Lock
-                             then Single_RTS_Lock'Access
-                             else Self_ID.Common.LL.L'Access),
-                 abstime => Request'Access);
+               end case;
 
-            Check_Time := Monotonic_Clock;
-            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
+               exit Outer
+                  when Abs_Time <= Check_Time or else Check_Time < Base_Time;
 
-            pragma Assert (Result in 0 | ETIMEDOUT | EINTR);
-         end loop;
+            end loop Inner;
+         end loop Outer;
 
          Self_ID.Common.State := Runnable;
       end if;
@@ -277,6 +319,7 @@ package body Monotonic is
          Unlock_RTS;
       end if;
 
+      pragma Unreferenced (Result);
       Result := sched_yield;
    end Timed_Delay;
 
diff --git a/gcc/ada/libgnat/s-optide.adb b/gcc/ada/libgnat/s-optide.adb
new file mode 100644 (file)
index 0000000..83245d6
--- /dev/null
@@ -0,0 +1,84 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT RUN-TIME COMPONENTS                         --
+--                                                                          --
+--     S Y S T E M . O S _ P R I M I T I V E S. T I M E D _ D E L A Y       --
+--                                                                          --
+--                                 B o d y                                  --
+--                                                                          --
+--                     Copyright (C) 2012-2018, AdaCore                     --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This is the Posix, Posix2008, and LynxOS version of this procedure.
+
+separate (System.OS_Primitives)
+procedure Timed_Delay
+  (Time : Duration;
+   Mode : Integer)
+is
+   Request    : aliased timespec;
+   Remaind    : aliased timespec;
+   Rel_Time   : Duration;
+   Abs_Time   : Duration;
+   Base_Time  : constant Duration := Clock;
+   Check_Time : Duration := Base_Time;
+   Time_Chunk : Duration;
+
+   Result : Integer;
+   pragma Unreferenced (Result);
+
+begin
+   if Mode = Relative then
+      Rel_Time := Time;
+      Abs_Time := Time + Check_Time;
+   else
+      Rel_Time := Time - Check_Time;
+      Abs_Time := Time;
+   end if;
+
+   --  To keep a sensible Max_Sensible_Delay on a target whose system
+   --  maximum is less than sensible, we split the delay into manageable
+   --  chunks of time less than or equal to the Max_System_Delay.
+
+   if Rel_Time > 0.0 then
+      Time_Chunk := Rel_Time;
+      loop
+         pragma Warnings (Off, "condition is always *");
+         if Max_System_Delay < Max_Sensible_Delay and then
+            Time_Chunk > Max_System_Delay
+         then
+            Time_Chunk := Max_System_Delay;
+         end if;
+         pragma Warnings (On);
+
+         Request := To_Timespec (Time_Chunk);
+         Result := nanosleep (Request'Access, Remaind'Access);
+
+         Check_Time := Clock;
+
+         exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
+
+         Time_Chunk := Abs_Time - Check_Time;
+      end loop;
+   end if;
+end Timed_Delay;
index 2df0a8e724b36578caa602ae72707b2a44f817a7..e3484d4eb6787b72e6692decffccae080ee208b6 100644 (file)
@@ -52,6 +52,10 @@ package System.OS_Primitives is
    --  with 32-bit words, and possibly on some specific ports of GNAT),
    --  Duration'Last is used instead.
 
+   Max_System_Delay : constant Duration := Max_Sensible_Delay;
+   --  If the Max_System_Delay is larger it doesn't matter. Setting it equal
+   --  allows optimization of code in some targets delay functions.
+
    procedure Initialize;
    --  Initialize global settings related to this package. This procedure
    --  should be called before any other subprograms in this package. Note
index d713a76dcf254a6d47074635d3cded1a0a8c4ba3..51aa149982a0ce7eec0f1e72dd67c3de2823ce83 100644 (file)
 package System.OS_Primitives is
    pragma Preelaborate;
 
-   Max_Sensible_Delay : constant Duration := 16#10_0000.0#;
-   --  LynxOS does not support delays as long as half a year, so we set this to
-   --  a shorter, but still fairly long, duration. Experiments show that if
-   --  pthread_cond_timedwait is passed an abstime much greater than about
-   --  2**21, it fails, returning EAGAIN. The cutoff is somewhere between
-   --  16#20_8000.0# and 16#20_F000.0#. This behavior is not documented.
+   Max_Sensible_Delay : constant Duration :=
+                          Duration'Min (183 * 24 * 60 * 60.0,
+                                        Duration'Last);
+   --  Max of half a year delay, needed to prevent exceptions for large delay
+   --  values. It seems unlikely that any test will notice this restriction,
+   --  except in the case of applications setting the clock at run time (see
+   --  s-tastim.adb). Also note that a larger value might cause problems (e.g
+   --  overflow, or more likely OS limitation in the primitives used). In the
+   --  case where half a year is too long (which occurs in high integrity mode
+   --  with 32-bit words, and possibly on some specific ports of GNAT),
+   --  Duration'Last is used instead.
+
+   Max_System_Delay : constant Duration := 2147483.0;
+   --  Note that Max_System_Delay is 2**31 / 1000 truncated.
+   --  LynxOS does not support delays as long as half a year, only the
+   --  number of seconds noted in Max_System_Delay, which is used to split
+   --  delays into chunks no larger than what the system can handle. This
+   --  maximum was found by experiment and is not documented.
 
    procedure Initialize;
    --  Initialize global settings related to this package. This procedure
index ed28d86f1406cd3385b2bb1b0a561515289f545b..6e1ad9a812f8cdaa040816084a12faa0157645a9 100644 (file)
@@ -127,38 +127,7 @@ package body System.OS_Primitives is
    procedure Timed_Delay
      (Time : Duration;
       Mode : Integer)
-   is
-      Request    : aliased timespec;
-      Remaind    : aliased timespec;
-      Rel_Time   : Duration;
-      Abs_Time   : Duration;
-      Base_Time  : constant Duration := Clock;
-      Check_Time : Duration := Base_Time;
-
-      Result : Integer;
-      pragma Unreferenced (Result);
-
-   begin
-      if Mode = Relative then
-         Rel_Time := Time;
-         Abs_Time := Time + Check_Time;
-      else
-         Rel_Time := Time - Check_Time;
-         Abs_Time := Time;
-      end if;
-
-      if Rel_Time > 0.0 then
-         loop
-            Request := To_Timespec (Rel_Time);
-            Result := nanosleep (Request'Access, Remaind'Access);
-            Check_Time := Clock;
-
-            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
-
-            Rel_Time := Abs_Time - Check_Time;
-         end loop;
-      end if;
-   end Timed_Delay;
+   is separate;
 
    ----------------
    -- Initialize --
index c6b0405cf5543517a39c27c3936ea7ba1bcb1799..2e717a912a079ce72a231212e82a3aaab67055e4 100644 (file)
@@ -127,38 +127,7 @@ package body System.OS_Primitives is
    procedure Timed_Delay
      (Time : Duration;
       Mode : Integer)
-   is
-      Request    : aliased timespec;
-      Remaind    : aliased timespec;
-      Rel_Time   : Duration;
-      Abs_Time   : Duration;
-      Base_Time  : constant Duration := Clock;
-      Check_Time : Duration := Base_Time;
-
-      Result : Integer;
-      pragma Unreferenced (Result);
-
-   begin
-      if Mode = Relative then
-         Rel_Time := Time;
-         Abs_Time := Time + Check_Time;
-      else
-         Rel_Time := Time - Check_Time;
-         Abs_Time := Time;
-      end if;
-
-      if Rel_Time > 0.0 then
-         loop
-            Request := To_Timespec (Rel_Time);
-            Result := nanosleep (Request'Access, Remaind'Access);
-            Check_Time := Clock;
-
-            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
-
-            Rel_Time := Abs_Time - Check_Time;
-         end loop;
-      end if;
-   end Timed_Delay;
+   is separate;
 
    ----------------
    -- Initialize --