split timer routines into Timer.h and Timer.C
[dyninst.git] / pdutil / src / Timer.C
1 // Timer.C
2
3 #include "util/h/Timer.h"
4
5 timer::timer()
6 : usecs_(0), ssecs_(0), wsecs_(0), cu_(0), cs_(0), cw_(0),
7   state_(STOPPED),
8   CYCLES_PER_SEC_(sysconf(_SC_CLK_TCK)), MICROSECS_PER_SEC_(1.0e6),
9   NANOSECS_PER_SEC_(1.0e9)
10 {
11 }
12
13 timer::timer(const timer& t)
14     : usecs_(t.usecs_), ssecs_(t.ssecs_), wsecs_(t.wsecs_),
15     cu_(t.cu_), cs_(t.cs_), cw_(t.cw_), state_(t.state_),
16     CYCLES_PER_SEC_(t.CYCLES_PER_SEC_), MICROSECS_PER_SEC_(t.MICROSECS_PER_SEC_),
17     NANOSECS_PER_SEC_(t.NANOSECS_PER_SEC_)
18 {
19 }
20
21 timer::~timer() {}
22
23 timer&
24 timer::operator=(const timer& t) {
25     if (this != &t) {
26         usecs_ = t.usecs_; ssecs_ = t.ssecs_; wsecs_ = t.wsecs_;
27         cu_    = t.cu_;    cs_    = t.cs_;    cw_    = t.cw_;
28         state_ = t.state_;
29     }
30     return *this;
31 }
32
33 timer&
34 timer::operator+=(const timer& t) {
35     timer st = t; st.stop();
36     usecs_ += st.usecs_;
37     ssecs_ += st.ssecs_;
38     wsecs_ += st.wsecs_;
39     return *this;
40 }
41
42 timer
43 timer::operator+(const timer& t) const {
44     timer ret = *this;
45     return ret += t;
46 }
47
48 void
49 timer::clear() {
50     usecs_ = ssecs_ = wsecs_ = 0;
51     cu_    = cs_    = cw_    = 0;
52     state_ = STOPPED;
53 }
54
55 void
56 timer::start() {
57     get_current(cu_, cs_, cw_);
58     state_ = RUNNING;
59 }
60
61 void
62 timer::stop() {
63     if (state_ == RUNNING) {
64         double cu, cs, cw;
65         get_current(cu, cs, cw);
66
67         usecs_ += (cu - cu_);
68         ssecs_ += (cs - cs_);
69         wsecs_ += (cw - cw_);
70         state_ = STOPPED;
71     }
72 }
73
74 double
75 timer::usecs() const {
76     return usecs_;
77 }
78
79 double
80 timer::ssecs() const {
81     return ssecs_;
82 }
83
84 double
85 timer::wsecs() const {
86     return wsecs_;
87 }
88
89 bool
90 timer::is_running() const {
91     return (state_ == RUNNING);
92 }
93
94 #if defined(notdef)
95 void
96 timer::print(ostream& os) {
97     timer_state ostate = state_;
98     if (ostate == RUNNING) {
99         stop();
100     }
101
102     os << "{"
103        << " usecs=" << usecs_
104        << " ssecs=" << ssecs_
105        << " wsecs=" << wsecs_
106        << " }";
107
108     if (ostate == RUNNING) {
109         start();
110     }
111 }
112 #endif
113
114 \f
115
116
117 /************************************************************************
118  * architecture/operating system specific timer functions.
119 ************************************************************************/
120
121
122 \f
123
124
125 #undef HAVE_GET_CURRENT_DEFINITION
126
127
128 \f
129
130
131 #if defined(sparc_sun_solaris2_4)
132 #if !defined(HAVE_GET_CURRENT_DEFINITION)
133 #define HAVE_GET_CURRENT_DEFINITION
134
135 #include <sys/time.h>
136 #include <sys/times.h>
137
138 void
139 timer::get_current(double& u, double& s, double& w) {
140     timer t;
141     u = gethrvtime() / t.NANOSECS_PER_SEC();
142
143     struct tms tb;
144     if (times(&tb) == -1) {
145       P_perror("times");
146       P_abort();
147     }
148     s = tb.tms_stime / t.CYCLES_PER_SEC();
149
150     w = gethrtime() / t.NANOSECS_PER_SEC();
151 }
152
153 #endif /* !defined(HAVE_GET_CURRENT_DEFINITION) */
154 #endif /* defined(sparc_sun_solaris2_4) */
155
156
157 \f
158
159
160 #if !defined(HAVE_GET_CURRENT_DEFINITION)
161 #define HAVE_GET_CURRENT_DEFINITION
162
163 #include <sys/types.h>
164 #include <sys/time.h>
165 #include <sys/times.h>
166
167 extern "C" gettimeofday(struct timeval *tp, struct timezone *tzp);
168
169 void
170 timer::get_current(double& u, double& s, double& w) {
171     struct tms     tb;
172     struct timeval tv;
173     if (times(&tb) == -1) {
174         perror("times");
175         abort();
176     }
177     if (gettimeofday(&tv, 0) == -1) {
178       P_perror("gettimeofday");
179       P_abort();
180     }
181
182     timer t;
183     u = tb.tms_utime / t.CYCLES_PER_SEC();
184     s = tb.tms_stime / t.CYCLES_PER_SEC();
185     w = (tv.tv_sec + tv.tv_usec/t.MICROSECS_PER_SEC());
186 }
187 #endif /* !defined(HAVE_GET_CURRENT_DEFINITION) */