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
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
)
70 EMACS_TIME r
= { s
, ns
};
74 /* Return an invalid Emacs time. */
75 SYSTIME_INLINE EMACS_TIME
76 invalid_emacs_time (void)
78 EMACS_TIME r
= { 0, -1 };
82 /* Return current system time. */
83 SYSTIME_INLINE EMACS_TIME
84 current_emacs_time (void)
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
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
115 EMACS_TIME_SIGN (EMACS_TIME t
)
117 return timespec_sign (t
);
120 /* Return 1 if TIME is a valid time stamp. */
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. */
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
);
162 /* Compare times T1 and T2 for equality, inequality etc. */
164 EMACS_TIME_EQ (EMACS_TIME t1
, EMACS_TIME t2
)
166 return timespec_cmp (t1
, t2
) == 0;
169 EMACS_TIME_NE (EMACS_TIME t1
, EMACS_TIME t2
)
171 return timespec_cmp (t1
, t2
) != 0;
174 EMACS_TIME_GT (EMACS_TIME t1
, EMACS_TIME t2
)
176 return timespec_cmp (t1
, t2
) > 0;
179 EMACS_TIME_GE (EMACS_TIME t1
, EMACS_TIME t2
)
181 return timespec_cmp (t1
, t2
) >= 0;
184 EMACS_TIME_LT (EMACS_TIME t1
, EMACS_TIME t2
)
186 return timespec_cmp (t1
, t2
) < 0;
189 EMACS_TIME_LE (EMACS_TIME t1
, EMACS_TIME t2
)
191 return timespec_cmp (t1
, t2
) <= 0;
196 #endif /* EMACS_SYSTIME_H */