Commit | Line | Data |
---|---|---|
10a4cc63 | 1 | /* systime.h - System-dependent definitions for time manipulations. |
ab422c4d | 2 | Copyright (C) 1993-1994, 2002-2013 Free Software Foundation, Inc. |
f469625a JB |
3 | |
4 | This file is part of GNU Emacs. | |
5 | ||
b9b1cc14 | 6 | GNU Emacs is free software: you can redistribute it and/or modify |
f469625a | 7 | it under the terms of the GNU General Public License as published by |
b9b1cc14 GM |
8 | the Free Software Foundation, either version 3 of the License, or |
9 | (at your option) any later version. | |
f469625a JB |
10 | |
11 | GNU Emacs is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
b9b1cc14 | 17 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
f469625a | 18 | |
fb1b041d DL |
19 | #ifndef EMACS_SYSTIME_H |
20 | #define EMACS_SYSTIME_H | |
482fa053 | 21 | |
d35af63c | 22 | #include <timespec.h> |
7b89707c | 23 | |
f162bcc3 PE |
24 | INLINE_HEADER_BEGIN |
25 | #ifndef SYSTIME_INLINE | |
26 | # define SYSTIME_INLINE INLINE | |
27 | #endif | |
28 | ||
89d1bd22 PE |
29 | #ifdef emacs |
30 | # ifdef HAVE_X_WINDOWS | |
31 | # include <X11/X.h> | |
32 | # else | |
08dc5ae6 | 33 | typedef unsigned long Time; |
89d1bd22 | 34 | # endif |
08dc5ae6 PE |
35 | #endif |
36 | ||
71068d78 KH |
37 | /* On some configurations (hpux8.0, X11R4), sys/time.h and X11/Xos.h |
38 | disagree about the name of the guard symbol. */ | |
c810639a | 39 | #ifdef HPUX |
71068d78 KH |
40 | #ifdef _STRUCT_TIMEVAL |
41 | #ifndef __TIMEVAL__ | |
42 | #define __TIMEVAL__ | |
43 | #endif | |
44 | #endif | |
c810639a | 45 | #endif |
696056c2 | 46 | |
696056c2 | 47 | #include <sys/time.h> /* for 'struct timeval' */ |
10a4cc63 | 48 | \f |
d9bee437 EZ |
49 | /* The type to use to represent non-negative temporal intervals. Its |
50 | address can be passed as the timeout argument to the pselect system | |
51 | call. */ | |
e9a9ae03 | 52 | typedef struct timespec EMACS_TIME; |
f469625a | 53 | |
d35af63c PE |
54 | /* Resolution of EMACS_TIME time stamps (in units per second), and log |
55 | base 10 of the resolution. The log must be a positive integer. */ | |
e9a9ae03 PE |
56 | enum { EMACS_TIME_RESOLUTION = 1000000000 }; |
57 | enum { LOG10_EMACS_TIME_RESOLUTION = 9 }; | |
58 | ||
59 | /* EMACS_SECS (TIME) is the seconds component of TIME. | |
60 | EMACS_NSECS (TIME) is the nanoseconds component of TIME. | |
61 | emacs_secs_addr (PTIME) is the address of *PTIME's seconds component. */ | |
f162bcc3 PE |
62 | SYSTIME_INLINE time_t EMACS_SECS (EMACS_TIME t) { return t.tv_sec; } |
63 | SYSTIME_INLINE int EMACS_NSECS (EMACS_TIME t) { return t.tv_nsec; } | |
64 | SYSTIME_INLINE time_t *emacs_secs_addr (EMACS_TIME *t) { return &t->tv_sec; } | |
e9a9ae03 PE |
65 | |
66 | /* Return an Emacs time with seconds S and nanoseconds NS. */ | |
f162bcc3 | 67 | SYSTIME_INLINE EMACS_TIME |
e9a9ae03 PE |
68 | make_emacs_time (time_t s, int ns) |
69 | { | |
954b166e PE |
70 | EMACS_TIME r; |
71 | r.tv_sec = s; | |
72 | r.tv_nsec = ns; | |
e9a9ae03 PE |
73 | return r; |
74 | } | |
75 | ||
76 | /* Return an invalid Emacs time. */ | |
f162bcc3 | 77 | SYSTIME_INLINE EMACS_TIME |
e9a9ae03 PE |
78 | invalid_emacs_time (void) |
79 | { | |
954b166e PE |
80 | EMACS_TIME r; |
81 | r.tv_sec = 0; | |
82 | r.tv_nsec = -1; | |
e9a9ae03 PE |
83 | return r; |
84 | } | |
85 | ||
86 | /* Return current system time. */ | |
f162bcc3 | 87 | SYSTIME_INLINE EMACS_TIME |
e9a9ae03 PE |
88 | current_emacs_time (void) |
89 | { | |
90 | EMACS_TIME r; | |
91 | gettime (&r); | |
92 | return r; | |
93 | } | |
94 | ||
95 | /* Return the result of adding A to B, or of subtracting B from A. | |
96 | On overflow, store an extremal value: ergo, if time_t is unsigned, | |
d9bee437 EZ |
97 | return 0 if the true answer would be negative. |
98 | ||
99 | WARNING: These are NOT general-purpose macros for adding or | |
100 | subtracting arbitrary time values! They are generally intended to | |
101 | be used with their first argument an absolute time since the epoch | |
102 | and the second argument a non-negative offset. Do NOT use them for | |
103 | anything else. */ | |
f162bcc3 | 104 | SYSTIME_INLINE EMACS_TIME |
e9a9ae03 PE |
105 | add_emacs_time (EMACS_TIME a, EMACS_TIME b) |
106 | { | |
107 | return timespec_add (a, b); | |
108 | } | |
f162bcc3 | 109 | SYSTIME_INLINE EMACS_TIME |
e9a9ae03 PE |
110 | sub_emacs_time (EMACS_TIME a, EMACS_TIME b) |
111 | { | |
112 | return timespec_sub (a, b); | |
113 | } | |
f469625a | 114 | |
d9bee437 EZ |
115 | /* Return the sign of the valid time stamp TIME, either -1, 0, or 1. |
116 | Note: this can only return a negative value if time_t is a signed | |
117 | data type. */ | |
f162bcc3 | 118 | SYSTIME_INLINE int |
e9a9ae03 PE |
119 | EMACS_TIME_SIGN (EMACS_TIME t) |
120 | { | |
121 | return timespec_sign (t); | |
122 | } | |
f469625a | 123 | |
d35af63c | 124 | /* Return 1 if TIME is a valid time stamp. */ |
f162bcc3 | 125 | SYSTIME_INLINE int |
e9a9ae03 PE |
126 | EMACS_TIME_VALID_P (EMACS_TIME t) |
127 | { | |
908589fd | 128 | return t.tv_nsec >= 0; |
e9a9ae03 | 129 | } |
722687f5 | 130 | |
d35af63c | 131 | /* Convert the double D to the greatest EMACS_TIME not greater than D. |
d9bee437 EZ |
132 | On overflow, return an extremal value; in particular, if time_t is |
133 | an unsigned data type and D is negative, return zero. Return the | |
134 | minimum EMACS_TIME if D is not a number. */ | |
f162bcc3 | 135 | SYSTIME_INLINE EMACS_TIME |
e9a9ae03 PE |
136 | EMACS_TIME_FROM_DOUBLE (double d) |
137 | { | |
138 | return dtotimespec (d); | |
139 | } | |
f469625a | 140 | |
d35af63c | 141 | /* Convert the Emacs time T to an approximate double value D. */ |
f162bcc3 | 142 | SYSTIME_INLINE double |
e9a9ae03 PE |
143 | EMACS_TIME_TO_DOUBLE (EMACS_TIME t) |
144 | { | |
145 | return timespectod (t); | |
146 | } | |
f469625a | 147 | |
d35af63c PE |
148 | /* defined in sysdep.c */ |
149 | extern int set_file_times (int, const char *, EMACS_TIME, EMACS_TIME); | |
b8dd59f7 | 150 | extern struct timeval make_timeval (EMACS_TIME) ATTRIBUTE_CONST; |
c53a6701 | 151 | |
43f15d4a | 152 | /* defined in keyboard.c */ |
383e0970 | 153 | extern void set_waiting_for_input (EMACS_TIME *); |
43f15d4a | 154 | |
fa8459a3 DN |
155 | /* When lisp.h is not included Lisp_Object is not defined (this can |
156 | happen when this files is used outside the src directory). | |
157 | Use GCPRO1 to determine if lisp.h was included. */ | |
158 | #ifdef GCPRO1 | |
d35af63c PE |
159 | /* defined in editfns.c */ |
160 | extern Lisp_Object make_lisp_time (EMACS_TIME); | |
a08d4ba7 PE |
161 | extern bool decode_time_components (Lisp_Object, Lisp_Object, Lisp_Object, |
162 | Lisp_Object, EMACS_TIME *, double *); | |
31571fd7 | 163 | extern EMACS_TIME lisp_time_argument (Lisp_Object); |
fa8459a3 DN |
164 | #endif |
165 | ||
c53a6701 | 166 | /* Compare times T1 and T2 for equality, inequality etc. */ |
f162bcc3 | 167 | SYSTIME_INLINE int |
e9a9ae03 PE |
168 | EMACS_TIME_EQ (EMACS_TIME t1, EMACS_TIME t2) |
169 | { | |
170 | return timespec_cmp (t1, t2) == 0; | |
171 | } | |
f162bcc3 | 172 | SYSTIME_INLINE int |
e9a9ae03 PE |
173 | EMACS_TIME_LT (EMACS_TIME t1, EMACS_TIME t2) |
174 | { | |
175 | return timespec_cmp (t1, t2) < 0; | |
176 | } | |
f162bcc3 | 177 | SYSTIME_INLINE int |
e9a9ae03 PE |
178 | EMACS_TIME_LE (EMACS_TIME t1, EMACS_TIME t2) |
179 | { | |
180 | return timespec_cmp (t1, t2) <= 0; | |
181 | } | |
c53a6701 | 182 | |
f162bcc3 PE |
183 | INLINE_HEADER_END |
184 | ||
fb1b041d | 185 | #endif /* EMACS_SYSTIME_H */ |