2 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3 * Copyright (c) 1991-1998 University of Maryland at College Park
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of U.M. not be used in advertising or
11 * publicity pertaining to distribution of the software without specific,
12 * written prior permission. U.M. makes no representations about the
13 * suitability of this software for any purpose. It is provided "as is"
14 * without express or implied warranty.
16 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
18 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 * Author: James da Silva, Systems Design and Analysis Group
24 * Computer Science Department
25 * University of Maryland at College Park
28 * $Id: clock.c,v 1.2.2.2 2002/03/31 21:01:33 jrjackson Exp $
37 static struct timeval timesub P((struct timeval end, struct timeval start));
38 static struct timeval timeadd P((struct timeval a, struct timeval b));
40 times_t times_zero = {{0,0}};
42 static int clock_running = 0;
44 #ifdef HAVE_TWO_ARG_GETTIMEOFDAY
45 # define amanda_gettimeofday(x, y) gettimeofday((x), (y))
47 # define amanda_gettimeofday(x, y) gettimeofday((x))
50 int clock_is_running()
57 #ifdef HAVE_TWO_ARG_GETTIMEOFDAY
58 struct timezone dontcare;
62 amanda_gettimeofday(&start_time.r, &dontcare);
68 struct timeval end_time;
70 #ifdef HAVE_TWO_ARG_GETTIMEOFDAY
71 struct timezone dontcare;
75 fprintf(stderr,"stopclock botch\n");
78 amanda_gettimeofday(&end_time, &dontcare);
79 diff.r = timesub(end_time,start_time.r);
87 struct timeval end_time;
89 #ifdef HAVE_TWO_ARG_GETTIMEOFDAY
90 struct timezone dontcare;
94 fprintf(stderr,"curclock botch\n");
97 amanda_gettimeofday(&end_time, &dontcare);
98 diff.r = timesub(end_time,start_time.r);
102 times_t timesadd(a,b)
107 sum.r = timeadd(a.r,b.r);
111 times_t timessub(a,b)
116 dif.r = timesub(a.r,b.r);
123 static char str[10][NUM_STR_SIZE+10];
127 /* tv_sec/tv_usec are longs on some systems */
128 ap_snprintf(str[n], sizeof(str[n]),
129 "rtime %d.%03d", (int)t.r.tv_sec, (int)t.r.tv_usec/1000);
131 n %= am_countof(str);
135 char *walltime_str(t)
138 static char str[10][NUM_STR_SIZE+10];
142 /* tv_sec/tv_usec are longs on some systems */
143 ap_snprintf(str[n], sizeof(str[n]),
144 "%d.%03d", (int)t.r.tv_sec, (int)t.r.tv_usec/1000);
146 n %= am_countof(str);
150 static struct timeval timesub(end,start)
151 struct timeval end,start;
155 if(end.tv_usec < start.tv_usec) { /* borrow 1 sec */
157 end.tv_usec += 1000000;
159 diff.tv_usec = end.tv_usec - start.tv_usec;
160 diff.tv_sec = end.tv_sec - start.tv_sec;
164 static struct timeval timeadd(a,b)
169 sum.tv_sec = a.tv_sec + b.tv_sec;
170 sum.tv_usec = a.tv_usec + b.tv_usec;
172 if(sum.tv_usec >= 1000000) {
173 sum.tv_usec -= 1000000;