File : a-exetim-mingw.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT RUN-TIME COMPONENTS                         --
   4 --                                                                          --
   5 --                   A D A . E X E C U T I O N _ T I M E                    --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --         Copyright (C) 2007-2012, Free Software Foundation, Inc.          --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  17 --                                                                          --
  18 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 -- You should have received a copy of the GNU General Public License and    --
  23 -- a copy of the GCC Runtime Library Exception along with this program;     --
  24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  25 -- <http://www.gnu.org/licenses/>.                                          --
  26 --                                                                          --
  27 -- GNAT was originally developed  by the GNAT team at  New York University. --
  28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  29 --                                                                          --
  30 ------------------------------------------------------------------------------
  31 
  32 --  This is the Windows native version of this package
  33 
  34 with Ada.Task_Identification;           use Ada.Task_Identification;
  35 with Ada.Unchecked_Conversion;
  36 
  37 with System.OS_Interface;               use System.OS_Interface;
  38 with System.Task_Primitives.Operations; use System.Task_Primitives.Operations;
  39 with System.Tasking;                    use System.Tasking;
  40 with System.Win32;                      use System.Win32;
  41 
  42 package body Ada.Execution_Time with
  43   SPARK_Mode => Off
  44 is
  45 
  46    ---------
  47    -- "+" --
  48    ---------
  49 
  50    function "+"
  51      (Left  : CPU_Time;
  52       Right : Ada.Real_Time.Time_Span) return CPU_Time
  53    is
  54       use type Ada.Real_Time.Time;
  55    begin
  56       return CPU_Time (Ada.Real_Time.Time (Left) + Right);
  57    end "+";
  58 
  59    function "+"
  60      (Left  : Ada.Real_Time.Time_Span;
  61       Right : CPU_Time) return CPU_Time
  62    is
  63       use type Ada.Real_Time.Time;
  64    begin
  65       return CPU_Time (Left + Ada.Real_Time.Time (Right));
  66    end "+";
  67 
  68    ---------
  69    -- "-" --
  70    ---------
  71 
  72    function "-"
  73      (Left  : CPU_Time;
  74       Right : Ada.Real_Time.Time_Span) return CPU_Time
  75    is
  76       use type Ada.Real_Time.Time;
  77    begin
  78       return CPU_Time (Ada.Real_Time.Time (Left) - Right);
  79    end "-";
  80 
  81    function "-"
  82      (Left  : CPU_Time;
  83       Right : CPU_Time) return Ada.Real_Time.Time_Span
  84    is
  85       use type Ada.Real_Time.Time;
  86    begin
  87       return (Ada.Real_Time.Time (Left) - Ada.Real_Time.Time (Right));
  88    end "-";
  89 
  90    -----------
  91    -- Clock --
  92    -----------
  93 
  94    function Clock
  95      (T : Ada.Task_Identification.Task_Id :=
  96         Ada.Task_Identification.Current_Task) return CPU_Time
  97    is
  98       Hundreds_Nano_In_Sec : constant Long_Long_Float := 1.0E7;
  99 
 100       function To_Time is new Ada.Unchecked_Conversion
 101         (Duration, Ada.Real_Time.Time);
 102 
 103       function To_Task_Id is new Ada.Unchecked_Conversion
 104         (Ada.Task_Identification.Task_Id, System.Tasking.Task_Id);
 105 
 106       C_Time : aliased Long_Long_Integer;
 107       E_Time : aliased Long_Long_Integer;
 108       K_Time : aliased Long_Long_Integer;
 109       U_Time : aliased Long_Long_Integer;
 110       Res    : BOOL;
 111 
 112    begin
 113       if T = Ada.Task_Identification.Null_Task_Id then
 114          raise Program_Error;
 115       end if;
 116 
 117       Res :=
 118         GetThreadTimes
 119           (HANDLE (Get_Thread_Id (To_Task_Id (T))),
 120            C_Time'Access, E_Time'Access, K_Time'Access, U_Time'Access);
 121 
 122       if Res = System.Win32.FALSE then
 123          raise Program_Error;
 124       end if;
 125 
 126       return
 127         CPU_Time
 128           (To_Time
 129              (Duration
 130                 ((Long_Long_Float (K_Time) / Hundreds_Nano_In_Sec)
 131                  + (Long_Long_Float (U_Time) / Hundreds_Nano_In_Sec))));
 132    end Clock;
 133 
 134    --------------------------
 135    -- Clock_For_Interrupts --
 136    --------------------------
 137 
 138    function Clock_For_Interrupts return CPU_Time is
 139    begin
 140       --  According to AI 0170-1, D.14(18.1/3), if Interrupt_Clocks_Supported
 141       --  is set to False the function raises Program_Error.
 142 
 143       raise Program_Error;
 144       return CPU_Time_First;
 145    end Clock_For_Interrupts;
 146 
 147    -----------
 148    -- Split --
 149    -----------
 150 
 151    procedure Split
 152      (T  : CPU_Time;
 153       SC : out Ada.Real_Time.Seconds_Count;
 154       TS : out Ada.Real_Time.Time_Span)
 155    is
 156       use type Ada.Real_Time.Time;
 157    begin
 158       Ada.Real_Time.Split (Ada.Real_Time.Time (T), SC, TS);
 159    end Split;
 160 
 161    -------------
 162    -- Time_Of --
 163    -------------
 164 
 165    function Time_Of
 166      (SC : Ada.Real_Time.Seconds_Count;
 167       TS : Ada.Real_Time.Time_Span := Ada.Real_Time.Time_Span_Zero)
 168       return CPU_Time
 169    is
 170    begin
 171       return CPU_Time (Ada.Real_Time.Time_Of (SC, TS));
 172    end Time_Of;
 173 
 174 end Ada.Execution_Time;