XEmacs 21.2.29 "Hestia".
[chise/xemacs-chise.git.1] / src / systime.h
1 /* systime.h - System-dependent definitions for time manipulations.
2    Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
3
4 This file is part of XEmacs.
5
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING.  If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 /* Synched up with: FSF 19.30. */
22
23 #ifndef INCLUDED_systime_h_
24 #define INCLUDED_systime_h_
25
26 #ifdef TIME_WITH_SYS_TIME
27 #include <sys/time.h>
28 #include <time.h>
29 #else
30 #ifdef HAVE_SYS_TIME_H
31 #include <sys/time.h>
32 #else
33 #include <time.h>
34 #endif
35 #endif
36
37 /* select() is supposed to be (Unix98) defined in sys/time.h,
38    but FreeBSD and Irix 5 put it in unistd.h instead.
39    If we have it, including it can't hurt. */
40 #ifdef HAVE_UNISTD_H
41 #include <unistd.h>
42 #endif
43
44 #if defined(WINDOWSNT) && defined(HAVE_X_WINDOWS)
45 /* Provides gettimeofday etc */
46 #include <X11/Xw32defs.h>
47 #include <X11/Xos.h>
48 #endif
49
50 #ifdef HAVE_UTIME_H
51 # include <utime.h>
52 #endif
53
54 #if defined(HAVE_TZNAME) && !defined(WINDOWSNT) && !defined(__CYGWIN32__)
55 #ifndef tzname          /* For SGI.  */
56 extern char *tzname[];  /* RS6000 and others want it this way.  */
57 #endif
58 #endif
59
60 /* On some configurations (hpux8.0, X11R4), sys/time.h and X11/Xos.h
61    disagree about the name of the guard symbol.  */
62 #ifdef HPUX
63 #ifdef _STRUCT_TIMEVAL
64 #ifndef __TIMEVAL__
65 #define __TIMEVAL__
66 #endif
67 #endif
68 #endif
69 \f
70 /* EMACS_TIME is the type to use to represent temporal intervals.
71    At one point this was 'struct timeval' on some systems, int on others.
72    But this is stupid.  Other things than select() code like to
73    manipulate time values, and so microsecond precision should be
74    maintained.  Separate typedefs and conversion functions are provided
75    for select().
76
77    EMACS_SECS (TIME) is an rvalue for the seconds component of TIME.
78    EMACS_SET_SECS (TIME, SECONDS) sets that to SECONDS.
79
80    EMACS_USECS (TIME) is an rvalue for the microseconds component of TIME.
81    EMACS_SET_USECS (TIME, MICROSECONDS) sets that to MICROSECONDS.
82
83    Note that all times are returned in "normalized" format (i.e. the
84    usecs value is in the range 0 <= value < 1000000) and are assumed
85    to be passed in in this format.
86
87    EMACS_SET_SECS_USECS (TIME, SECS, USECS) sets both components of TIME.
88
89    EMACS_GET_TIME (TIME) stores the current system time in TIME, which
90         should be an lvalue.
91
92    set_file_times (PATH, ATIME, MTIME) changes the last-access and
93         last-modification times of the file named PATH to ATIME and
94         MTIME, which are EMACS_TIMEs.
95
96    EMACS_NORMALIZE_TIME (TIME) coerces TIME into normalized format.
97
98    EMACS_ADD_TIME (DEST, SRC1, SRC2) adds SRC1 to SRC2 and stores the
99         result in DEST.  Either or both may be negative.
100
101    EMACS_SUB_TIME (DEST, SRC1, SRC2) subtracts SRC2 from SRC1 and
102         stores the result in DEST.  Either or both may be negative.
103
104    EMACS_TIME_NEG_P (TIME) is true iff TIME is negative.
105
106    EMACS_TIME_EQUAL (TIME1, TIME2) is true iff TIME1 is the same as TIME2.
107    EMACS_TIME_GREATER (TIME1, TIME2) is true iff TIME1 is greater than
108         TIME2.
109    EMACS_TIME_EQUAL_OR_GREATER (TIME1, TIME2) is true iff TIME1 is
110         greater than or equal to TIME2.
111
112 */
113
114 #ifdef HAVE_TIMEVAL
115
116 #define EMACS_SELECT_TIME struct timeval
117 #define EMACS_TIME_TO_SELECT_TIME(time, select_time) ((select_time) = (time))
118
119 #else /* not HAVE_TIMEVAL */
120
121 struct timeval
122 {
123   long tv_sec;                /* seconds */
124   long tv_usec;               /* microseconds */
125 };
126
127 #define EMACS_SELECT_TIME int
128 #define EMACS_TIME_TO_SELECT_TIME(time, select_time) \
129   EMACS_TIME_TO_INT (time, select_time)
130
131 #endif /* not HAVE_TIMEVAL */
132
133 #define EMACS_TIME_TO_INT(time, intvar)         \
134 do {                                            \
135   EMACS_TIME tmptime = time;                    \
136                                                 \
137   if (tmptime.tv_usec > 0)                      \
138     (intvar) = tmptime.tv_sec + 1;              \
139   else                                          \
140     (intvar) = tmptime.tv_sec;                  \
141 } while (0)
142
143 #define EMACS_TIME struct timeval
144 #define EMACS_SECS(time)                    ((time).tv_sec  + 0)
145 #define EMACS_USECS(time)                   ((time).tv_usec + 0)
146 #define EMACS_SET_SECS(time, seconds)       ((time).tv_sec  = (seconds))
147 #define EMACS_SET_USECS(time, microseconds) ((time).tv_usec = (microseconds))
148
149 #if !defined (HAVE_GETTIMEOFDAY)
150 int gettimeofday (struct timeval *, void *);
151 #endif
152
153 /* On SVR4, the compiler may complain if given this extra BSD arg.  */
154 #ifdef GETTIMEOFDAY_ONE_ARGUMENT
155 #define EMACS_GETTIMEOFDAY(time) gettimeofday(time)
156 #else
157 #define EMACS_GETTIMEOFDAY(time) gettimeofday(time,0)
158 #endif
159
160 /* According to the Xt sources, some NTP daemons on some systems may
161    return non-normalized values. */
162 #define EMACS_GET_TIME(time)                                    \
163 do {                                                            \
164   EMACS_GETTIMEOFDAY (&(time));                                 \
165   EMACS_NORMALIZE_TIME (time);                                  \
166 } while (0)
167
168 #define EMACS_NORMALIZE_TIME(time)                              \
169 do {                                                            \
170   while ((time).tv_usec >= 1000000)                             \
171     {                                                           \
172       (time).tv_usec -= 1000000;                                \
173       (time).tv_sec++;                                          \
174     }                                                           \
175   while ((time).tv_usec < 0)                                    \
176     {                                                           \
177       (time).tv_usec += 1000000;                                \
178       (time).tv_sec--;                                          \
179     }                                                           \
180 } while (0)
181
182 #define EMACS_ADD_TIME(dest, src1, src2)                        \
183 do {                                                            \
184   (dest).tv_sec  = (src1).tv_sec  + (src2).tv_sec;              \
185   (dest).tv_usec = (src1).tv_usec + (src2).tv_usec;             \
186   EMACS_NORMALIZE_TIME (dest);                                  \
187 } while (0)
188
189 #define EMACS_SUB_TIME(dest, src1, src2)                        \
190 do {                                                            \
191   (dest).tv_sec  = (src1).tv_sec  - (src2).tv_sec;              \
192   (dest).tv_usec = (src1).tv_usec - (src2).tv_usec;             \
193   EMACS_NORMALIZE_TIME (dest);                                  \
194 } while (0)
195
196 #define EMACS_TIME_NEG_P(time) ((long)(time).tv_sec < 0)
197
198 #define EMACS_TIME_EQUAL(time1, time2)                          \
199   ((time1).tv_sec == (time2).tv_sec &&                          \
200    (time1).tv_usec == (time2).tv_usec)
201
202 #define EMACS_TIME_GREATER(time1, time2)                        \
203   ((time1).tv_sec > (time2).tv_sec ||                           \
204    ((time1).tv_sec == (time2).tv_sec &&                         \
205     (time1).tv_usec > (time2).tv_usec))
206
207 #define EMACS_TIME_EQUAL_OR_GREATER(time1, time2)               \
208   ((time1).tv_sec > (time2).tv_sec ||                           \
209    ((time1).tv_sec == (time2).tv_sec &&                         \
210     (time1).tv_usec >= (time2).tv_usec))
211
212 #define EMACS_SET_SECS_USECS(time, secs, usecs)                 \
213   (EMACS_SET_SECS (time, secs), EMACS_SET_USECS (time, usecs))
214
215 int set_file_times (char *filename, EMACS_TIME atime, EMACS_TIME mtime);
216
217 void get_process_times (double *user_time, double *system_time,
218                         double *real_time);
219
220 #if defined(WINDOWSNT) || defined(BROKEN_CYGWIN) || defined(__MINGW32__)
221
222 /* setitimer emulation for Win32 (see nt.c) */
223
224 struct itimerval
225 {
226   struct timeval it_value;
227   struct timeval it_interval;
228 };
229
230 int setitimer (int kind, const struct itimerval* itnew,
231                struct itimerval* itold);
232
233 #define ITIMER_REAL 1
234 #define ITIMER_PROF 2
235
236 #endif /* WINDOWSNT */
237
238 #endif /* INCLUDED_systime_h_ */