|
|
1.1 root 1: /* proctm.c
2: Get the time spent in the process.
3:
4: Copyright (C) 1992 Ian Lance Taylor
5:
6: This file is part of the Taylor UUCP package.
7:
8: This program is free software; you can redistribute it and/or
9: modify it under the terms of the GNU General Public License as
10: published by the Free Software Foundation; either version 2 of the
11: License, or (at your option) any later version.
12:
13: This program is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: General Public License for more details.
17:
18: You should have received a copy of the GNU General Public License
19: along with this program; if not, write to the Free Software
20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22: The author of the program may be contacted at [email protected] or
23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
24: */
25:
26: #include "uucp.h"
27:
28: #include "sysdep.h"
29: #include "system.h"
30:
31: #if HAVE_SYS_PARAM_H
32: #include <sys/param.h>
33: #endif
34:
35: #if HAVE_LIMITS_H
36: #include <limits.h>
37: #endif
38:
39: /* Prefer gettimeofday to ftime to times. */
40:
41: #if HAVE_GETTIMEOFDAY || HAVE_FTIME
42: #undef HAVE_TIMES
43: #define HAVE_TIMES 0
44: #endif
45:
46: #if HAVE_GETTIMEOFDAY
47: #undef HAVE_FTIME
48: #define HAVE_FTIME 0
49: #endif
50:
51: #if HAVE_TIME_H && (HAVE_SYS_TIME_AND_TIME_H || ! HAVE_GETTIMEOFDAY)
52: #include <time.h>
53: #endif
54:
55: #if HAVE_GETTIMEOFDAY
56: #include <sys/time.h>
57: #endif
58:
59: #if HAVE_FTIME
60: #include <sys/timeb.h>
61: #endif
62:
63: #if HAVE_TIMES
64:
65: #if HAVE_SYS_TIMES_H
66: #include <sys/times.h>
67: #endif
68:
69: #if TIMES_DECLARATION_OK
70: /* We use a macro to protect this because times really returns clock_t
71: and on some systems, such as Ultrix 4.0, clock_t is int. We don't
72: leave it out entirely because on some systems, such as System III,
73: the declaration is necessary for correct compilation. */
74: #ifndef times
75: extern long times ();
76: #endif
77: #endif /* TIMES_DECLARATION_OK */
78:
79: #ifdef _SC_CLK_TCK
80: #define HAVE_SC_CLK_TCK 1
81: #else
82: #define HAVE_SC_CLK_TCK 0
83: #endif
84:
85: /* TIMES_TICK may have been set in policy.h, or we may be able to get
86: it using sysconf. If neither is the case, try to find a useful
87: definition from the system header files. */
88: #if TIMES_TICK == 0 && (! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK)
89: #ifdef CLK_TCK
90: #undef TIMES_TICK
91: #define TIMES_TICK CLK_TCK
92: #else /* ! defined (CLK_TCK) */
93: #ifdef HZ
94: #undef TIMES_TICK
95: #define TIMES_TICK HZ
96: #endif /* defined (HZ) */
97: #endif /* ! defined (CLK_TCK) */
98: #endif /* TIMES_TICK == 0 && (! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK) */
99:
100: #endif /* HAVE_TIMES */
101:
102: #ifndef time
103: extern time_t time ();
104: #endif
105: #if HAVE_SYSCONF
106: #ifndef sysconf
107: extern long sysconf ();
108: #endif
109: #endif
110:
111: /* Get the time in seconds and microseconds; this need only work
112: within the process when called from the system independent code.
113: It is also called by ixsysdep_time. */
114:
115: long
116: ixsysdep_process_time (pimicros)
117: long *pimicros;
118: {
119: #if HAVE_GETTIMEOFDAY
120: struct timeval stime;
121: struct timezone stz;
122:
123: (void) gettimeofday (&stime, &stz);
124: if (pimicros != NULL)
125: *pimicros = (long) stime.tv_usec;
126: return (long) stime.tv_sec;
127: #endif /* HAVE_GETTIMEOFDAY */
128:
129: #if HAVE_FTIME
130: static boolean fbad;
131:
132: if (! fbad)
133: {
134: struct timeb stime;
135: static struct timeb slast;
136:
137: (void) ftime (&stime);
138:
139: /* On some systems, such as SCO 3.2.2, ftime can go backwards in
140: time. If we detect this, we switch to using time. */
141: if (slast.time != 0
142: && (stime.time < slast.time
143: || (stime.time == slast.time &&
144: stime.millitm < slast.millitm)))
145: fbad = TRUE;
146: else
147: {
148: slast = stime;
149: if (pimicros != NULL)
150: *pimicros = (long) stime.millitm * (long) 1000;
151: return (long) stime.time;
152: }
153: }
154:
155: if (pimicros != NULL)
156: *pimicros = 0;
157: return (long) time ((time_t *) NULL);
158: #endif /* HAVE_FTIME */
159:
160: #if HAVE_TIMES
161: struct tms s;
162: long i;
163: static int itick;
164:
165: if (itick == 0)
166: {
167: #if TIMES_TICK == 0
168: #if HAVE_SYSCONF && HAVE_SC_CLK_TCK
169: itick = (int) sysconf (_SC_CLK_TCK);
170: #else /* ! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK */
171: const char *z;
172:
173: z = getenv ("HZ");
174: if (z != NULL)
175: itick = (int) strtol (z, (char **) NULL, 10);
176:
177: /* If we really couldn't get anything, just use 60. */
178: if (itick == 0)
179: itick = 60;
180: #endif /* ! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK */
181: #else /* TIMES_TICK != 0 */
182: itick = TIMES_TICK;
183: #endif /* TIMES_TICK == 0 */
184: }
185:
186: i = (long) times (&s);
187: if (pimicros != NULL)
188: *pimicros = (i % (long) itick) * ((long) 1000000 / (long) itick);
189: return i / (long) itick;
190: #endif /* HAVE_TIMES */
191:
192: #if ! HAVE_GETTIMEOFDAY && ! HAVE_FTIME && ! HAVE_TIMES
193: if (pimicros != NULL)
194: *pimicros = 0;
195: return (long) time ((time_t *) NULL);
196: #endif /* ! HAVE_GETTIMEOFDAY && ! HAVE_FTIME && ! HAVE_TIMES */
197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.