1 /*
2 Copyright (C) 1990, 1992 Free Software Foundation
3     written by Doug Lea (dl@rocky.oswego.edu)
4 
5 This file is part of the GNU C++ Library.  This library is free
6 software; you can redistribute it and/or modify it under the terms of
7 the GNU Library General Public License as published by the Free
8 Software Foundation; either version 2 of the License, or (at your
9 option) any later version.  This library is distributed in the hope
10 that it will be useful, but WITHOUT ANY WARRANTY; without even the
11 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE.  See the GNU Library General Public License for more details.
13 You should have received a copy of the GNU Library General Public
14 License along with this library; if not, write to the Free Software
15 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16 */
17 
18 #ifdef __GNUG__
19 #pragma implementation
20 #endif
21 #include <builtin.h>
22 
23 // Timing functions from Doug Schmidt...
24 
25 /* no such thing as "negative time"! */
26 #define  TIMER_ERROR_VALUE -1.0
27 
28 // If this does not work on your system, change this to #if 0, and
29 // report the problem
30 
31 #if 1
32 
33 #include <_G_config.h>
34 #include <osfcn.h>
35 #if !_G_HAVE_SYS_RESOURCE || !defined(RUSAGE_SELF)
36 #define USE_TIMES
37 #include <sys/param.h>
38 #include <sys/times.h>
39 #if !defined (HZ) && defined(CLK_TCK)
40 #define HZ CLK_TCK
41 #endif
42 static struct tms Old_Time;
43 static struct tms New_Time;
44 #else
45 static struct rusage Old_Time;
46 static struct rusage New_Time;
47 #endif
48 static int    Timer_Set = 0;
49 
50 double start_timer()
51 {
52    Timer_Set = 1;
53 #ifdef USE_TIMES
54    times(&Old_Time);
55    return((double) Old_Time.tms_utime / HZ);
56 #else
57    getrusage(RUSAGE_SELF,&Old_Time);        /* set starting process time */
58    return(Old_Time.ru_utime.tv_sec + (Old_Time.ru_utime.tv_usec / 1000000.0));
59 #endif
60 }
61 
62 /* Returns process time since Last_Time.
63    If parameter is 0.0, returns time since the Old_Time was set.
64    Returns TIMER_ERROR_VALUE if `start_timer' is not called first.  */
65 
66 double return_elapsed_time(double Last_Time)
67 {
68    if (!Timer_Set) {
69       return(TIMER_ERROR_VALUE);
70    }
71    else {
72     /* get process time */
73 #ifdef USE_TIMES
74       times(&New_Time);
75 #else
76       getrusage(RUSAGE_SELF,&New_Time);
77 #endif
78       if (Last_Time == 0.0) {
79 #ifdef USE_TIMES
80 	 return((double) (New_Time.tms_utime - Old_Time.tms_utime) / HZ);
81 #else
82          return((New_Time.ru_utime.tv_sec - Old_Time.ru_utime.tv_sec) +
83                ((New_Time.ru_utime.tv_usec - Old_Time.ru_utime.tv_usec)
84                 / 1000000.0));
85 #endif
86       }
87       else {
88 #ifdef USE_TIMES
89 	 return((double) New_Time.tms_utime / HZ - Last_Time);
90 #else
91          return((New_Time.ru_utime.tv_sec +
92                 (New_Time.ru_utime.tv_usec / 1000000.0)) - Last_Time);
93 #endif
94       }
95    }
96 }
97 
98 #ifdef VMS
99 void sys$gettim(unsigned int*) asm("sys$gettim");
100 
101 getrusage(int dummy,struct rusage* time){
102 	double rtime;
103 	unsigned int systime[2];
104 	int i;
105 	sys$gettim(&systime[0]);
106 	rtime=systime[1];
107 	for(i=0;i<4;i++) rtime *= 256;
108 	rtime+= systime[0];
109 /* we subtract an offset to make sure that the number fits in a long int*/
110 	rtime=rtime/1.0e+7-4.144e+9;
111 	time->ru_utime.tv_sec= rtime;
112 	rtime=(rtime-time->ru_utime.tv_sec)*1.0e6;
113 	time->ru_utime.tv_usec= rtime;
114 }
115 #endif
116 #else /* dummy them out */
117 
118 double start_timer()
119 {
120   return TIMER_ERROR_VALUE;
121 }
122 
123 double return_elapsed_time(double)
124 {
125   return TIMER_ERROR_VALUE;
126 }
127 
128 #endif /* timing stuff */
129 
130 
131