Annotation of embedaddon/lrzsz/src/timing.c, revision 1.1.1.1
1.1 misho 1: /*
2: timing.c - Timing routines for computing elapsed wall time
3: Copyright (C) 1994 Michael D. Black
4: Copyright (C) 1996, 1997 Uwe Ohse
5:
6: This program 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 2, or (at your option)
9: any later version.
10:
11: This program 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.
15:
16: You should have received a copy of the GNU General Public License
17: along with this program; if not, write to the Free Software
18: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19: 02111-1307, USA.
20:
21: originally written by Michael D. Black, mblack@csihq.com
22: */
23:
24: #include "zglobal.h"
25:
26: #include "timing.h"
27:
28: #if HAVE_SYS_PARAM_H
29: #include <sys/param.h>
30: #endif
31:
32: #if !defined(TIME_WITH_SYS_TIME) && !defined(HAVE_SYS_TIME_H)
33: /* can't use gettimeofday without struct timeval */
34: # undef HAVE_GETTIMEOFDAY
35: #endif
36:
37: /* Prefer gettimeofday to ftime to times. */
38: #if defined(HAVE_GETTIMEOFDAY)
39: # undef HAVE_FTIME
40: # undef HAVE_TIMES
41: #else
42: # if defined(HAVE_FTIME)
43: # undef HAVE_TIMES
44: # endif
45: #endif
46:
47: #ifdef HAVE_FTIME
48: # include <sys/timeb.h>
49: #endif
50:
51: #ifdef HAVE_TIMES
52: # if HAVE_SYS_TIMES_H
53: # include <sys/times.h>
54: # endif
55: # ifdef _SC_CLK_TCK
56: # define HAVE_SC_CLK_TCK 1
57: # else
58: # define HAVE_SC_CLK_TCK 0
59: # endif
60: /* TIMES_TICK may have been set in policy.h, or we may be able to get
61: it using sysconf. If neither is the case, try to find a useful
62: definition from the system header files. */
63: # if !defined(TIMES_TICK) && (!defined(HAVE_SYSCONF) || !defined(HAVE_SC_CLK_TCK))
64: # ifdef CLK_TCK
65: # define TIMES_TICK CLK_TCK
66: # else /* ! defined (CLK_TCK) */
67: # ifdef HZ
68: # define TIMES_TICK HZ
69: # endif /* defined (HZ) */
70: # endif /* ! defined (CLK_TCK) */
71: #else
72: # endif /* TIMES_TICK == 0 && (! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK) */
73: # ifndef TIMES_TICK
74: # define TIMES_TICK 0
75: # endif
76: #endif /* HAVE_TIMES */
77:
78: #ifdef HAVE_GETTIMEOFDAY
79: /* collides with Solaris 2.5 prototype? */
80: /* int gettimeofday (struct timeval *tv, struct timezone *tz); */
81: #endif
82:
83: double
84: timing (int reset, time_t *nowp)
85: {
86: static double elaptime, starttime, stoptime;
87: double yet;
88: #define NEED_TIME
89: #ifdef HAVE_GETTIMEOFDAY
90: struct timeval tv;
91: struct timezone tz;
92:
93: #ifdef DST_NONE
94: tz.tz_dsttime = DST_NONE;
95: #else
96: tz.tz_dsttime = 0;
97: #endif
98: gettimeofday (&tv, &tz);
99: yet=tv.tv_sec + tv.tv_usec/1000000.0;
100: #undef NEED_TIME
101: #endif
102: #ifdef HAVE_FTIME
103: static int fbad=0;
104:
105: if (! fbad)
106: {
107: struct timeb stime;
108: static struct timeb slast;
109:
110: (void) ftime (&stime);
111:
112: /* On some systems, such as SCO 3.2.2, ftime can go backwards in
113: time. If we detect this, we switch to using time. */
114: if (slast.time != 0
115: && (stime.time < slast.time
116: || (stime.time == slast.time && stime.millitm < slast.millitm)))
117: fbad = 1;
118: else
119: {
120: yet = stime.millitm / 1000.0 + stime.time;
121: slast = stime;
122: }
123: }
124: if (fbad)
125: yet=(double) time(NULL);
126: #undef NEED_TIME
127: #endif
128:
129: #ifdef HAVE_TIMES
130: struct tms s;
131: long i;
132: static int itick;
133:
134: if (itick == 0)
135: {
136: #if TIMES_TICK == 0
137: #if HAVE_SYSCONF && HAVE_SC_CLK_TCK
138: itick = (int) sysconf (_SC_CLK_TCK);
139: #else /* ! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK */
140: const char *z;
141:
142: z = getenv ("HZ");
143: if (z != NULL)
144: itick = (int) strtol (z, (char **) NULL, 10);
145:
146: /* If we really couldn't get anything, just use 60. */
147: if (itick == 0)
148: itick = 60;
149: #endif /* ! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK */
150: #else /* TIMES_TICK != 0 */
151: itick = TIMES_TICK;
152: #endif /* TIMES_TICK == 0 */
153: }
154: yet = ((double) times (&s)) / itick;
155: #undef NEED_TIME
156: #endif
157:
158: #ifdef NEED_TIME
159: yet=(double) time(NULL);
160: #endif
161: if (nowp)
162: *nowp=(time_t) yet;
163: if (reset) {
164: starttime = yet;
165: return starttime;
166: }
167: else {
168: stoptime = yet;
169: elaptime = stoptime - starttime;
170: return elaptime;
171: }
172: }
173:
174: /*#define TEST*/
175: #ifdef TEST
176: main()
177: {
178: int i;
179: printf("timing %g\n",timing(1));
180: printf("timing %g\n",timing(0));
181: for(i=0;i<20;i++){
182: sleep(1);
183: printf("timing %g\n",timing(0));
184: }
185: }
186: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>