enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / ardour / cycle_timer.cc
index c48b7fb861e07fbd0d42e36913b3a3819ce62d29..4742d9617403c7095577a42641a23584943eb5f7 100644 (file)
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cstdio>
-#include <pbd/error.h>
-#include <ardour/cycle_timer.h>
+#include <fstream>
+#include "pbd/error.h"
+#include "ardour/cycle_timer.h"
 
-#include "i18n.h"
+#include "ardour/libardour_visibility.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
 
 float CycleTimer::cycles_per_usec = 0;
 
 float
-CycleTimer::get_mhz()
+get_mhz()
 {
        FILE *f;
-       
+
        if ((f = fopen("/proc/cpuinfo", "r")) == 0) {
                fatal << _("CycleTimer::get_mhz(): can't open /proc/cpuinfo") << endmsg;
-               /*NOTREACHED*/
+               abort(); /*NOTREACHED*/
                return 0.0f;
        }
 
@@ -45,7 +50,7 @@ CycleTimer::get_mhz()
 
                if (fgets (buf, sizeof(buf), f) == 0) {
                        fatal << _("CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo") << endmsg;
-                       /*NOTREACHED*/
+                       abort(); /*NOTREACHED*/
                        return 0.0f;
                }
 
@@ -67,7 +72,59 @@ CycleTimer::get_mhz()
                }
        }
 
-       fatal << _("cannot locate cpu MHz in /proc/cpuinfo") << endmsg; 
-       /*NOTREACHED*/
+       fatal << _("cannot locate cpu MHz in /proc/cpuinfo") << endmsg;
+       abort(); /*NOTREACHED*/
        return 0.0f;
 }
+
+StoringTimer::StoringTimer (int N)
+{
+       _point = new int[N];
+       _value = new cycles_t[N];
+       _ref = new cycles_t[N];
+       _max_points = N;
+       _points = 0;
+}
+
+#ifndef NDEBUG
+void
+StoringTimer::dump (string const & file)
+{
+       ofstream f (file.c_str ());
+
+       f << min (_points, _max_points) << "\n";
+       f << get_mhz () << "\n";
+       for (int i = 0; i < min (_points, _max_points); ++i) {
+               f << _point[i] << " " << _ref[i] << " " << _value[i] << "\n";
+       }
+}
+#endif
+
+void
+StoringTimer::ref ()
+{
+       _current_ref = get_cycles ();
+}
+
+void
+StoringTimer::check (int p)
+{
+       if (_points == _max_points) {
+               ++_points;
+               return;
+       } else if (_points > _max_points) {
+               return;
+       }
+
+       _point[_points] = p;
+       _value[_points] = get_cycles ();
+       _ref[_points] = _current_ref;
+
+       ++_points;
+}
+
+#ifdef PT_TIMING
+StoringTimer ST (64 * 1024);
+#endif
+
+