1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- 4-- -- 5-- S Y S T E M . O S _ P R I M I T I V E S -- 6-- -- 7-- B o d y -- 8-- -- 9-- Copyright (C) 1998-2021, Free Software Foundation, Inc. -- 10-- -- 11-- GNARL 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-- As a special exception under Section 7 of GPL version 3, you are granted -- 19-- additional permissions described in the GCC Runtime Library Exception, -- 20-- version 3.1, as published by the Free Software Foundation. -- 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-- GNARL was developed by the GNARL team at Florida State University. -- 28-- Extensive contributions were provided by Ada Core Technologies, Inc. -- 29-- -- 30------------------------------------------------------------------------------ 31 32-- This version is for POSIX-like operating systems 33with System.Parameters; 34 35package body System.OS_Primitives is 36 37 -- ??? These definitions are duplicated from System.OS_Interface 38 -- because we don't want to depend on any package. Consider removing 39 -- these declarations in System.OS_Interface and move these ones in 40 -- the spec. 41 42 type time_t is range -2 ** (System.Parameters.time_t_bits - 1) 43 .. 2 ** (System.Parameters.time_t_bits - 1) - 1; 44 45 type timespec is record 46 tv_sec : time_t; 47 tv_nsec : Long_Integer; 48 end record; 49 pragma Convention (C, timespec); 50 51 function nanosleep (rqtp, rmtp : not null access timespec) return Integer; 52 pragma Import (C, nanosleep, "nanosleep"); 53 54 ----------- 55 -- Clock -- 56 ----------- 57 58 function Clock return Duration is 59 60 type timeval is array (1 .. 3) of Long_Integer; 61 -- The timeval array is sized to contain Long_Long_Integer sec and 62 -- Long_Integer usec. If Long_Long_Integer'Size = Long_Integer'Size then 63 -- it will be overly large but that will not effect the implementation 64 -- since it is not accessed directly. 65 66 procedure timeval_to_duration 67 (T : not null access timeval; 68 sec : not null access Long_Long_Integer; 69 usec : not null access Long_Integer); 70 pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); 71 72 Micro : constant := 10**6; 73 sec : aliased Long_Long_Integer; 74 usec : aliased Long_Integer; 75 TV : aliased timeval; 76 Result : Integer; 77 pragma Unreferenced (Result); 78 79 function gettimeofday 80 (Tv : access timeval; 81 Tz : System.Address := System.Null_Address) return Integer; 82 pragma Import (C, gettimeofday, "gettimeofday"); 83 84 begin 85 -- The return codes for gettimeofday are as follows (from man pages): 86 -- EPERM settimeofday is called by someone other than the superuser 87 -- EINVAL Timezone (or something else) is invalid 88 -- EFAULT One of tv or tz pointed outside accessible address space 89 90 -- None of these codes signal a potential clock skew, hence the return 91 -- value is never checked. 92 93 Result := gettimeofday (TV'Access, System.Null_Address); 94 timeval_to_duration (TV'Access, sec'Access, usec'Access); 95 return Duration (sec) + Duration (usec) / Micro; 96 end Clock; 97 98 ----------------- 99 -- To_Timespec -- 100 ----------------- 101 102 function To_Timespec (D : Duration) return timespec; 103 104 function To_Timespec (D : Duration) return timespec is 105 S : time_t; 106 F : Duration; 107 108 begin 109 S := time_t (Long_Long_Integer (D)); 110 F := D - Duration (S); 111 112 -- If F has negative value due to a round-up, adjust for positive F 113 -- value. 114 115 if F < 0.0 then 116 S := S - 1; 117 F := F + 1.0; 118 end if; 119 120 return 121 timespec'(tv_sec => S, 122 tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9))); 123 end To_Timespec; 124 125 ----------------- 126 -- Timed_Delay -- 127 ----------------- 128 129 procedure Timed_Delay 130 (Time : Duration; 131 Mode : Integer) 132 is separate; 133 134 ---------------- 135 -- Initialize -- 136 ---------------- 137 138 procedure Initialize is 139 begin 140 null; 141 end Initialize; 142 143end System.OS_Primitives; 144