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
start_timer()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
return_elapsed_time(double Last_Time)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
getrusage(int dummy,struct rusage * time)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
start_timer()118 double start_timer()
119 {
120 return TIMER_ERROR_VALUE;
121 }
122
return_elapsed_time(double)123 double return_elapsed_time(double)
124 {
125 return TIMER_ERROR_VALUE;
126 }
127
128 #endif /* timing stuff */
129
130
131