1 /* systime.h - System-dependent definitions for time manipulations.
2 Copyright (C) 1993-1994, 2002-2013 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
25 #ifndef SYSTIME_INLINE
26 # define SYSTIME_INLINE INLINE
30 # ifdef HAVE_X_WINDOWS
33 typedef unsigned long Time
;
37 /* On some configurations (hpux8.0, X11R4), sys/time.h and X11/Xos.h
38 disagree about the name of the guard symbol. */
40 #ifdef _STRUCT_TIMEVAL
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
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
)
76 /* Return an invalid Emacs time. */
77 SYSTIME_INLINE EMACS_TIME
78 invalid_emacs_time (void)
86 /* Return current system time. */
87 SYSTIME_INLINE EMACS_TIME
88 current_emacs_time (void)
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,
97 return 0 if the true answer would be negative.
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
104 SYSTIME_INLINE EMACS_TIME
105 add_emacs_time (EMACS_TIME a
, EMACS_TIME b
)
107 return timespec_add (a
, b
);
109 SYSTIME_INLINE EMACS_TIME
110 sub_emacs_time (EMACS_TIME a
, EMACS_TIME b
)
112 return timespec_sub (a
, b
);
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
119 EMACS_TIME_SIGN (EMACS_TIME t
)
121 return timespec_sign (t
);
124 /* Return 1 if TIME is a valid time stamp. */
126 EMACS_TIME_VALID_P (EMACS_TIME t
)
128 return t
.tv_nsec
>= 0;
131 /* Convert the double D to the greatest EMACS_TIME not greater than D.
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. */
135 SYSTIME_INLINE EMACS_TIME
136 EMACS_TIME_FROM_DOUBLE (double d
)
138 return dtotimespec (d
);
141 /* Convert the Emacs time T to an approximate double value D. */
142 SYSTIME_INLINE
double
143 EMACS_TIME_TO_DOUBLE (EMACS_TIME t
)
145 return timespectod (t
);
148 /* defined in sysdep.c */
149 extern int set_file_times (int, const char *, EMACS_TIME
, EMACS_TIME
);
150 extern struct timeval
make_timeval (EMACS_TIME
) ATTRIBUTE_CONST
;
152 /* defined in keyboard.c */
153 extern void set_waiting_for_input (EMACS_TIME
*);
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. */
159 /* defined in editfns.c */
160 extern Lisp_Object
make_lisp_time (EMACS_TIME
);
161 extern bool decode_time_components (Lisp_Object
, Lisp_Object
, Lisp_Object
,
162 Lisp_Object
, EMACS_TIME
*, double *);
163 extern EMACS_TIME
lisp_time_argument (Lisp_Object
);
166 /* Compare times T1 and T2 for equality, inequality etc. */
168 EMACS_TIME_EQ (EMACS_TIME t1
, EMACS_TIME t2
)
170 return timespec_cmp (t1
, t2
) == 0;
173 EMACS_TIME_LT (EMACS_TIME t1
, EMACS_TIME t2
)
175 return timespec_cmp (t1
, t2
) < 0;
178 EMACS_TIME_LE (EMACS_TIME t1
, EMACS_TIME t2
)
180 return timespec_cmp (t1
, t2
) <= 0;
185 #endif /* EMACS_SYSTIME_H */