------------------------------------------------------------------------------
--                                                                          --
--                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
--                                                                          --
--                  S Y S T E M . O S _ P R I M I T I V E S                 --
--                                                                          --
--                                  B o d y                                 --
--                                                                          --
--                                                                          --
--         Copyright (C) 1998-2001 Free Software Foundation, Inc.           --
--                                                                          --
-- GNARL 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 2,  or (at your option) any later ver- --
-- sion. GNARL 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.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNARL; see file COPYING.  If not, write --
-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
-- MA 02111-1307, USA.                                                      --
--                                                                          --
-- As a special exception,  if other files  instantiate  generics from this --
-- unit, or you link  this unit with other files  to produce an executable, --
-- this  unit  does not  by itself cause  the resulting  executable  to  be --
-- covered  by the  GNU  General  Public  License.  This exception does not --
-- however invalidate  any other reasons why  the executable file  might be --
-- covered by the  GNU Public License.                                      --
--                                                                          --
-- GNARL was developed by the GNARL team at Florida State University.       --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  This is the OS/2 version of this package

with Interfaces.C;                      use Interfaces.C;
with Interfaces.OS2Lib;                 use Interfaces.OS2Lib;
with Interfaces.OS2Lib.Synchronization; use Interfaces.OS2Lib.Synchronization;

package body System.OS_Primitives is

   ----------------
   -- Local Data --
   ----------------

   Epoch_Offset    : Duration;       --  See Set_Epoch_Offset
   Max_Tick_Count  : QWORD := 0.0;
   --  This is needed to compensate for small glitches in the
   --  hardware clock or the way it is read by the OS

   -----------------------
   -- Local Subprograms --
   -----------------------

   procedure Set_Epoch_Offset;
   --  Initializes the Epoch_1970_Offset to the offset of the System_Clock
   --  relative to the Unix epoch (Jan 1, 1970), such that
   --     Clock = System_Clock + Epoch_1970_Offset

   function System_Clock return Duration;
   pragma Inline (System_Clock);
   --  Function returning value of system clock with system-dependent timebase.
   --  For OS/2 the system clock returns the elapsed time since system boot.
   --  The clock resolution is approximately 838 ns.

   ------------------
   -- System_Clock --
   ------------------

   function System_Clock return Duration is

      --  Implement conversion from tick count to Duration
      --  using fixed point arithmetic. The frequency of
      --  the Intel 8254 timer chip is 18.2 * 2**16 Hz.

      Tick_Duration : constant := 1.0 / (18.2 * 2**16);
      Tick_Count    : aliased QWORD;

   begin
      Must_Not_Fail (DosTmrQueryTime (Tick_Count'Access));
      --  Read nr of clock ticks since boot time

      Max_Tick_Count := QWORD'Max (Tick_Count, Max_Tick_Count);

      return Max_Tick_Count * Tick_Duration;
   end System_Clock;

   -----------
   -- Clock --
   -----------

   function Clock return Duration is
   begin
      return System_Clock + Epoch_Offset;
   end Clock;

   ---------------------
   -- Monotonic_Clock --
   ---------------------

   function Monotonic_Clock return Duration renames Clock;

   ----------------------
   -- Set_Epoch_Offset --
   ----------------------

   procedure Set_Epoch_Offset is

      --  Interface to Unix C style gettimeofday

      type timeval is record
         tv_sec  : long;
         tv_usec : long;
      end record;

      procedure gettimeofday
        (time : access timeval;
         zone : System.Address := System.Address'Null_Parameter);
      pragma Import (C, gettimeofday);

      Time_Of_Day       : aliased timeval;
      Micro_To_Nano     : constant := 1.0E3;
      Sec_To_Nano       : constant := 1.0E9;
      Nanos_Since_Epoch : QWORD;

   begin
      gettimeofday (Time_Of_Day'Access);
      Nanos_Since_Epoch := QWORD (Time_Of_Day.tv_sec) * Sec_To_Nano
        + QWORD (Time_Of_Day.tv_usec) * Micro_To_Nano;

      Epoch_Offset :=
         Duration'(Nanos_Since_Epoch / Sec_To_Nano) - System_Clock;

   end Set_Epoch_Offset;

   -----------------
   -- Timed_Delay --
   -----------------

   procedure Timed_Delay
     (Time : Duration;
      Mode : Integer)
   is
      Rel_Time   : Duration;
      Abs_Time   : Duration;
      Check_Time : Duration := Clock;

   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
            Must_Not_Fail (DosSleep (ULONG (Rel_Time * 1000.0)));

            Check_Time := Clock;

            exit when Abs_Time <= Check_Time;

            Rel_Time := Abs_Time - Check_Time;
         end loop;
      end if;
   end Timed_Delay;

begin
   Set_Epoch_Offset;
end System.OS_Primitives;
