Merge into trunk
[emacs.git] / src / systime.h
blob9ce7ce646fb1897b3f8a301f81d4f53c52a89487
1 /* systime.h - System-dependent definitions for time manipulations.
2 Copyright (C) 1993-1994, 2002-2012 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
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.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
19 #ifndef EMACS_SYSTIME_H
20 #define EMACS_SYSTIME_H
22 #include <timespec.h>
24 INLINE_HEADER_BEGIN
25 #ifndef SYSTIME_INLINE
26 # define SYSTIME_INLINE INLINE
27 #endif
29 #ifdef emacs
30 # ifdef HAVE_X_WINDOWS
31 # include <X11/X.h>
32 # else
33 typedef unsigned long Time;
34 # endif
35 #endif
37 /* On some configurations (hpux8.0, X11R4), sys/time.h and X11/Xos.h
38 disagree about the name of the guard symbol. */
39 #ifdef HPUX
40 #ifdef _STRUCT_TIMEVAL
41 #ifndef __TIMEVAL__
42 #define __TIMEVAL__
43 #endif
44 #endif
45 #endif
47 #include <sys/time.h> /* for 'struct timeval' */
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. */
52 typedef struct timespec EMACS_TIME;
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. */
56 enum { EMACS_TIME_RESOLUTION = 1000000000 };
57 enum { LOG10_EMACS_TIME_RESOLUTION = 9 };
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. */
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; }
66 /* Return an Emacs time with seconds S and nanoseconds NS. */
67 SYSTIME_INLINE EMACS_TIME
68 make_emacs_time (time_t s, int ns)
70 EMACS_TIME r = { s, ns };
71 return r;
74 /* Return an invalid Emacs time. */
75 SYSTIME_INLINE EMACS_TIME
76 invalid_emacs_time (void)
78 EMACS_TIME r = { 0, -1 };
79 return r;
82 /* Return current system time. */
83 SYSTIME_INLINE EMACS_TIME
84 current_emacs_time (void)
86 EMACS_TIME r;
87 gettime (&r);
88 return r;
91 /* Return the result of adding A to B, or of subtracting B from A.
92 On overflow, store an extremal value: ergo, if time_t is unsigned,
93 return 0 if the true answer would be negative.
95 WARNING: These are NOT general-purpose macros for adding or
96 subtracting arbitrary time values! They are generally intended to
97 be used with their first argument an absolute time since the epoch
98 and the second argument a non-negative offset. Do NOT use them for
99 anything else. */
100 SYSTIME_INLINE EMACS_TIME
101 add_emacs_time (EMACS_TIME a, EMACS_TIME b)
103 return timespec_add (a, b);
105 SYSTIME_INLINE EMACS_TIME
106 sub_emacs_time (EMACS_TIME a, EMACS_TIME b)
108 return timespec_sub (a, b);
111 /* Return the sign of the valid time stamp TIME, either -1, 0, or 1.
112 Note: this can only return a negative value if time_t is a signed
113 data type. */
114 SYSTIME_INLINE int
115 EMACS_TIME_SIGN (EMACS_TIME t)
117 return timespec_sign (t);
120 /* Return 1 if TIME is a valid time stamp. */
121 SYSTIME_INLINE int
122 EMACS_TIME_VALID_P (EMACS_TIME t)
124 return 0 <= t.tv_nsec;
127 /* Convert the double D to the greatest EMACS_TIME not greater than D.
128 On overflow, return an extremal value; in particular, if time_t is
129 an unsigned data type and D is negative, return zero. Return the
130 minimum EMACS_TIME if D is not a number. */
131 SYSTIME_INLINE EMACS_TIME
132 EMACS_TIME_FROM_DOUBLE (double d)
134 return dtotimespec (d);
137 /* Convert the Emacs time T to an approximate double value D. */
138 SYSTIME_INLINE double
139 EMACS_TIME_TO_DOUBLE (EMACS_TIME t)
141 return timespectod (t);
144 /* defined in sysdep.c */
145 extern int set_file_times (int, const char *, EMACS_TIME, EMACS_TIME);
146 extern struct timeval make_timeval (EMACS_TIME);
148 /* defined in keyboard.c */
149 extern void set_waiting_for_input (EMACS_TIME *);
151 /* When lisp.h is not included Lisp_Object is not defined (this can
152 happen when this files is used outside the src directory).
153 Use GCPRO1 to determine if lisp.h was included. */
154 #ifdef GCPRO1
155 /* defined in editfns.c */
156 extern Lisp_Object make_lisp_time (EMACS_TIME);
157 extern bool decode_time_components (Lisp_Object, Lisp_Object, Lisp_Object,
158 Lisp_Object, EMACS_TIME *, double *);
159 extern EMACS_TIME lisp_time_argument (Lisp_Object);
160 #endif
162 /* Compare times T1 and T2 for equality, inequality etc. */
163 SYSTIME_INLINE int
164 EMACS_TIME_EQ (EMACS_TIME t1, EMACS_TIME t2)
166 return timespec_cmp (t1, t2) == 0;
168 SYSTIME_INLINE int
169 EMACS_TIME_NE (EMACS_TIME t1, EMACS_TIME t2)
171 return timespec_cmp (t1, t2) != 0;
173 SYSTIME_INLINE int
174 EMACS_TIME_GT (EMACS_TIME t1, EMACS_TIME t2)
176 return timespec_cmp (t1, t2) > 0;
178 SYSTIME_INLINE int
179 EMACS_TIME_GE (EMACS_TIME t1, EMACS_TIME t2)
181 return timespec_cmp (t1, t2) >= 0;
183 SYSTIME_INLINE int
184 EMACS_TIME_LT (EMACS_TIME t1, EMACS_TIME t2)
186 return timespec_cmp (t1, t2) < 0;
188 SYSTIME_INLINE int
189 EMACS_TIME_LE (EMACS_TIME t1, EMACS_TIME t2)
191 return timespec_cmp (t1, t2) <= 0;
194 INLINE_HEADER_END
196 #endif /* EMACS_SYSTIME_H */