2 Copyright (C) 2014 Tim Mayberry
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.
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.
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.
22 #include "pbd/timer.h"
23 #include "pbd/debug.h"
24 #include "pbd/compose.h"
30 class StandardTimer : public PBD::StandardTimer
33 StandardTimer (unsigned int interval)
34 : PBD::StandardTimer(interval)
37 virtual bool on_elapsed () {
38 DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_interval_data);
39 DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_exec_data);
41 bool ret_val = PBD::StandardTimer::on_elapsed ();
43 DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_exec_data);
44 DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_interval_data);
49 PBD::TimingData timing_interval_data;
50 PBD::TimingData timing_exec_data;
54 class BlinkTimer : public PBD::BlinkTimer
57 BlinkTimer (unsigned int interval)
58 : PBD::BlinkTimer(interval)
61 virtual bool on_elapsed () {
62 DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_interval_data);
63 DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_exec_data);
65 bool ret_val = PBD::BlinkTimer::on_elapsed ();
67 DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_exec_data);
68 DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_interval_data);
73 PBD::TimingData timing_interval_data;
74 PBD::TimingData timing_exec_data;
93 second.connect (sigc::mem_fun (*this, &UITimers::on_second_timer));
100 StandardTimer super_rapid;
103 gint _suspend_counter;
106 std::vector<uint64_t> rapid_eps_count;
107 std::vector<uint64_t> super_rapid_eps_count;
108 std::vector<uint64_t> fps_eps_count;
112 void debug_rapid_timer () {
113 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Connections: %1\n", rapid.connection_count ()));
115 rapid_eps_count.push_back (rapid.timing_exec_data.size());
117 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Exec Totals: %1", PBD::timing_summary (rapid_eps_count)));
119 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Interval: %1", rapid.timing_interval_data.summary()));
120 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Exec: %1", rapid.timing_exec_data.summary()));
121 DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, rapid.timing_interval_data);
122 DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, rapid.timing_exec_data);
125 void debug_super_rapid_timer () {
126 // we don't use this timer on windows so don't display empty data for it
127 #ifndef PLATFORM_WINDOWS
129 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Connections: %1\n", super_rapid.connection_count ()));
131 super_rapid_eps_count.push_back (super_rapid.timing_exec_data.size());
133 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Exec Totals: %1", PBD::timing_summary (super_rapid_eps_count)));
134 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Interval: %1", super_rapid.timing_interval_data.summary()));
135 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Exec: %1", super_rapid.timing_exec_data.summary()));
136 DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, super_rapid.timing_interval_data);
137 DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, super_rapid.timing_exec_data);
141 void debug_fps_timer () {
142 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Connections: %1\n", fps.connection_count ()));
144 fps_eps_count.push_back (fps.timing_exec_data.size());
146 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Exec Totals: %1", PBD::timing_summary (fps_eps_count)));
148 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Interval: %1", fps.timing_interval_data.summary()));
149 DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Exec: %1", fps.timing_exec_data.summary()));
150 DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, fps.timing_interval_data);
151 DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, fps.timing_exec_data);
154 void on_second_timer () {
155 debug_rapid_timer ();
156 debug_super_rapid_timer ();
165 static UITimers timers;
174 blink_connect(const sigc::slot<void,bool>& slot)
176 return get_timers().blink.connect (slot);
180 second_connect(const sigc::slot<void>& slot)
182 return get_timers().second.connect (slot);
186 rapid_connect(const sigc::slot<void>& slot)
188 return get_timers().rapid.connect (slot);
192 super_rapid_connect(const sigc::slot<void>& slot)
194 #ifdef PLATFORM_WINDOWS
195 return get_timers().fps.connect (slot);
197 return get_timers().super_rapid.connect (slot);
202 set_fps_interval (unsigned int interval)
204 get_timers().fps.set_interval (interval);
208 fps_connect(const sigc::slot<void>& slot)
210 return get_timers().fps.connect (slot);
213 TimerSuspender::TimerSuspender ()
215 if (g_atomic_int_add(&get_timers()._suspend_counter, 1) == 0) {
216 get_timers().rapid.suspend();
217 get_timers().super_rapid.suspend();
218 get_timers().fps.suspend();
222 TimerSuspender::~TimerSuspender ()
224 if (g_atomic_int_dec_and_test (&get_timers()._suspend_counter)) {
225 get_timers().rapid.resume();
226 get_timers().super_rapid.resume();
227 get_timers().fps.resume();
231 } // namespace Timers