ardour
cycle_timer.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002 Andrew Morton
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #include <cstdio>
21 #include <fstream>
22 #include "pbd/error.h"
23 #include "ardour/cycle_timer.h"
24 
26 
27 #include "i18n.h"
28 
29 using namespace std;
30 using namespace PBD;
31 
33 
34 float
36 {
37  FILE *f;
38 
39  if ((f = fopen("/proc/cpuinfo", "r")) == 0) {
40  fatal << _("CycleTimer::get_mhz(): can't open /proc/cpuinfo") << endmsg;
41  abort(); /*NOTREACHED*/
42  return 0.0f;
43  }
44 
45  while (true) {
46 
47  float mhz;
48  int ret;
49  char buf[1000];
50 
51  if (fgets (buf, sizeof(buf), f) == 0) {
52  fatal << _("CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo") << endmsg;
53  abort(); /*NOTREACHED*/
54  return 0.0f;
55  }
56 
57 #ifdef __powerpc__
58 
59  int imhz;
60 
61  /* why can't the PPC crew standardize their /proc/cpuinfo format ? */
62  ret = sscanf (buf, "clock\t: %dMHz", &imhz);
63  mhz = (float) imhz;
64 
65 #else /* XXX don't assume its x86 just because its not power pc */
66  ret = sscanf (buf, "cpu MHz : %f", &mhz);
67 
68 #endif
69  if (ret == 1) {
70  fclose(f);
71  return mhz;
72  }
73  }
74 
75  fatal << _("cannot locate cpu MHz in /proc/cpuinfo") << endmsg;
76  abort(); /*NOTREACHED*/
77  return 0.0f;
78 }
79 
81 {
82  _point = new int[N];
83  _value = new cycles_t[N];
84  _ref = new cycles_t[N];
85  _max_points = N;
86  _points = 0;
87 }
88 
89 
90 void
91 StoringTimer::dump (string const & file)
92 {
93  ofstream f (file.c_str ());
94 
95  f << min (_points, _max_points) << "\n";
96  f << get_mhz () << "\n";
97  for (int i = 0; i < min (_points, _max_points); ++i) {
98  f << _point[i] << " " << _ref[i] << " " << _value[i] << "\n";
99  }
100 }
101 
102 void
104 {
105  _current_ref = get_cycles ();
106 }
107 
108 void
110 {
111  if (_points == _max_points) {
112  ++_points;
113  return;
114  } else if (_points > _max_points) {
115  return;
116  }
117 
118  _point[_points] = p;
119  _value[_points] = get_cycles ();
120  _ref[_points] = _current_ref;
121 
122  ++_points;
123 }
124 
125 #ifdef PT_TIMING
126 StoringTimer ST (64 * 1024);
127 #endif
128 
129 
LIBPBD_API Transmitter fatal
void check(int)
Definition: cycle_timer.cc:109
static int N
Definition: signals_test.cc:27
tuple f
Definition: signals.py:35
Definition: Beats.hpp:239
void dump(std::string const &)
Definition: cycle_timer.cc:91
std::ostream & endmsg(std::ostream &ostr)
Definition: transmitter.h:71
static float cycles_per_usec
Definition: cycle_timer.h:35
static cycles_t get_cycles(void)
Definition: cycles.h:230
#define _(Text)
Definition: i18n.h:11
float get_mhz()
Definition: cycle_timer.cc:35
StoringTimer(int)
Definition: cycle_timer.cc:80
Definition: debug.h:30
long cycles_t
Definition: cycles.h:226