1 #include "timer_test.h"
9 #ifdef PLATFORM_WINDOWS
13 CPPUNIT_TEST_SUITE_REGISTRATION (TimerTest);
17 #ifdef PLATFORM_WINDOWS
19 min_timer_resolution ()
21 static UINT min_res_ms = 0;
26 set_min_timer_resolution ()
30 if (timeGetDevCaps(&caps, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
31 cerr << "Could not get timer device capabilities..." << endl;
33 if (timeBeginPeriod(caps.wPeriodMin) != TIMERR_NOERROR) {
34 cerr << "Could not set minimum timer resolution to: " << caps.wPeriodMin << "ms" << endl;
38 cerr << "Multimedia timer resolution set to: " << caps.wPeriodMin << "ms" << endl;
39 min_timer_resolution() = caps.wPeriodMin;
47 reset_timer_resolution ()
49 if (min_timer_resolution()) {
50 if (timeEndPeriod(min_timer_resolution()) != TIMERR_NOERROR) {
51 cerr << "Could not reset timer resolution" << endl;
54 cerr << "Multimedia timer resolution reset" << endl;
64 TimerTest::simulate_load (const string& name, guint64 load_usecs)
67 std::ostringstream oss;
68 oss << name << " Load.";
80 } while (timing.elapsed () < load_usecs);
82 oss << "Expected = " << load_usecs;
83 oss << ", Elapsed = " << timing.elapsed ();
89 TimerTest::on_second_timeout ()
92 cerr << "Timing Summary: " << m_current_test_name << endl;
94 if (m_idle_timing_data.size()) {
95 cerr << "Idle Timing: " << m_idle_timing_data.summary();
97 if (m_fast_timing_data.size()) {
98 cerr << "Fast Timing: " << m_fast_timing_data.summary();
100 if (m_rapid1_timing_data.size()) {
101 cerr << "Rapid1 Timing: " << m_rapid1_timing_data.summary();
103 if (m_rapid2_timing_data.size()) {
104 cerr << "Rapid2 Timing: " << m_rapid2_timing_data.summary();
110 TimerTest::on_second_timeout_glibmm ()
112 TimerTest::on_second_timeout ();
117 TimerTest::on_fast_timeout ()
119 m_fast_timing_data.add_interval ();
121 // do nothing, handled in rapid timers
123 simulate_load ("Rapid1", 4000);
128 TimerTest::on_fast_timeout_glibmm ()
135 TimerTest::on_rapid1_timeout ()
137 m_rapid1_timing_data.add_interval ();
139 simulate_load ("Rapid1", rapid1_timer_usecs () * 0.5);
141 simulate_load ("Rapid1", 2000);
146 TimerTest::on_rapid1_timeout_glibmm ()
148 on_rapid1_timeout ();
153 TimerTest::on_rapid2_timeout ()
155 m_rapid2_timing_data.add_interval ();
157 simulate_load ("Rapid2", rapid2_timer_usecs () * 0.5);
159 simulate_load ("Rapid2", 2000);
164 TimerTest::on_rapid2_timeout_glibmm ()
166 on_rapid2_timeout ();
171 TimerTest::on_idle_handler ()
173 m_idle_timing_data.add_interval ();
175 simulate_load ("Idle", rapid2_timer_usecs ());
181 TimerTest::on_quit_handler ()
183 cerr << "Quit Handler" << endl;
189 TimerTest::reset_timing ()
191 m_idle_timing_data.reset ();
192 m_fast_timing_data.reset ();
193 m_rapid1_timing_data.reset ();
194 m_rapid2_timing_data.reset ();
198 TimerTest::start_timing ()
200 m_idle_timing_data.start_timing ();
201 m_fast_timing_data.start_timing ();
202 m_rapid1_timing_data.start_timing ();
203 m_rapid2_timing_data.start_timing ();
207 TimerTest::_second_timeout_handler (void *data)
209 TimerTest *const tt = static_cast<TimerTest*>(data);
210 tt->on_second_timeout ();
215 TimerTest::_fast_timeout_handler (void *data)
217 TimerTest *const tt = static_cast<TimerTest*>(data);
218 tt->on_fast_timeout ();
223 TimerTest::_rapid1_timeout_handler (void *data)
225 TimerTest *const tt = static_cast<TimerTest*>(data);
226 tt->on_rapid1_timeout ();
231 TimerTest::_rapid2_timeout_handler (void *data)
233 TimerTest *const tt = static_cast<TimerTest*>(data);
234 tt->on_rapid2_timeout ();
239 TimerTest::reset_timing_run_main ()
244 connect_quit_timeout ();
246 m_main = Glib::MainLoop::create (m_context);
251 TimerTest::testGlibTimeoutSources ()
253 m_current_test_name = "testGlibTimeoutSources";
254 _testGlibTimeoutSources ();
258 TimerTest::_testGlibTimeoutSources ()
260 m_context = Glib::MainContext::create ();
262 GSource * second_timeout_source = g_timeout_source_new (second_timer_ms ());
264 g_source_set_callback (second_timeout_source , &TimerTest::_second_timeout_handler, this, NULL);
266 g_source_attach (second_timeout_source, m_context->gobj());
268 if (m_connect_idle) {
269 connect_idle_handler ();
270 reset_timing_run_main ();
273 GSource * fast_timeout_source = g_timeout_source_new (fast_timer_ms ());
275 g_source_set_callback (fast_timeout_source , &TimerTest::_fast_timeout_handler, this, NULL);
277 g_source_attach (fast_timeout_source, m_context->gobj());
279 // now run with fast timeout
280 reset_timing_run_main ();
282 GSource * rapid1_timeout_source = g_timeout_source_new (rapid1_timer_ms ());
284 g_source_set_callback (rapid1_timeout_source , &TimerTest::_rapid1_timeout_handler, this, NULL);
286 g_source_attach (rapid1_timeout_source, m_context->gobj());
288 // now run with fast and rapid1 timeouts
289 reset_timing_run_main ();
291 GSource * rapid2_timeout_source = g_timeout_source_new (rapid2_timer_ms ());
293 g_source_set_callback (rapid2_timeout_source , &TimerTest::_rapid2_timeout_handler, this, NULL);
295 g_source_attach (rapid2_timeout_source, m_context->gobj());
297 // now run with fast, rapid1 and rapid2 timeouts
298 reset_timing_run_main ();
301 g_source_destroy (second_timeout_source);
302 g_source_unref (second_timeout_source);
304 g_source_destroy (fast_timeout_source);
305 g_source_unref (fast_timeout_source);
307 g_source_destroy (rapid1_timeout_source);
308 g_source_unref (rapid1_timeout_source);
310 g_source_destroy (rapid2_timeout_source);
311 g_source_unref (rapid2_timeout_source);
315 TimerTest::testGlibmmSignalTimeouts ()
317 m_current_test_name = "testGlibmmSignalTimeouts";
318 _testGlibmmSignalTimeouts ();
322 TimerTest::_testGlibmmSignalTimeouts ()
324 m_context = Glib::MainContext::get_default ();
326 Glib::signal_timeout().connect(sigc::mem_fun(*this, &TimerTest::on_second_timeout_glibmm), second_timer_ms());
328 if (m_connect_idle) {
329 connect_idle_handler ();
330 reset_timing_run_main ();
333 Glib::signal_timeout().connect(sigc::mem_fun(*this, &TimerTest::on_fast_timeout_glibmm), fast_timer_ms());
335 reset_timing_run_main ();
337 Glib::signal_timeout().connect(sigc::mem_fun(*this, &TimerTest::on_rapid1_timeout_glibmm), rapid1_timer_ms());
339 reset_timing_run_main ();
341 Glib::signal_timeout().connect(sigc::mem_fun(*this, &TimerTest::on_rapid2_timeout_glibmm), rapid2_timer_ms());
343 reset_timing_run_main ();
347 TimerTest::testGlibmmTimeoutSources ()
349 m_current_test_name = "testGlibmmTimeoutSources";
350 _testGlibmmTimeoutSources ();
354 TimerTest::_testGlibmmTimeoutSources ()
356 m_context = Glib::MainContext::create ();
358 const Glib::RefPtr<Glib::TimeoutSource> second_source = Glib::TimeoutSource::create(second_timer_ms());
359 second_source->connect(sigc::mem_fun(*this, &TimerTest::on_second_timeout_glibmm));
361 second_source->attach(m_context);
363 if (m_connect_idle) {
364 connect_idle_handler ();
365 reset_timing_run_main ();
368 const Glib::RefPtr<Glib::TimeoutSource> fast_source = Glib::TimeoutSource::create(fast_timer_ms());
369 fast_source->connect(sigc::mem_fun(*this, &TimerTest::on_fast_timeout_glibmm));
371 fast_source->attach(m_context);
373 reset_timing_run_main ();
375 const Glib::RefPtr<Glib::TimeoutSource> rapid1_source = Glib::TimeoutSource::create(rapid1_timer_ms());
376 sigc::connection rapid1_connection = rapid1_source->connect(sigc::mem_fun(*this, &TimerTest::on_rapid1_timeout_glibmm));
378 rapid1_source->attach(m_context);
380 reset_timing_run_main ();
382 const Glib::RefPtr<Glib::TimeoutSource> rapid2_source = Glib::TimeoutSource::create(rapid2_timer_ms());
383 sigc::connection rapid2_connection = rapid2_source->connect(sigc::mem_fun(*this, &TimerTest::on_rapid2_timeout_glibmm));
385 rapid2_source->attach(m_context);
387 reset_timing_run_main ();
391 TimerTest::connect_idle_handler ()
393 const Glib::RefPtr<Glib::IdleSource> idle_source = Glib::IdleSource::create();
394 idle_source->connect(sigc::mem_fun(*this, &TimerTest::on_idle_handler));
396 idle_source->attach(m_context);
400 TimerTest::connect_quit_timeout ()
402 const Glib::RefPtr<Glib::TimeoutSource> quit_source = Glib::TimeoutSource::create(test_length_ms());
403 quit_source->connect(sigc::mem_fun(*this, &TimerTest::on_quit_handler));
405 quit_source->attach(m_context);
409 TimerTest::testTimers ()
411 m_current_test_name = "testTimers";
416 TimerTest::_testTimers ()
418 m_context = Glib::MainContext::create ();
420 PBD::StandardTimer second_timer (second_timer_ms (), m_context);
421 sigc::connection second_connection = second_timer.connect (sigc::mem_fun (this, &TimerTest::on_second_timeout));
423 if (m_connect_idle) {
424 connect_idle_handler ();
425 // let the idle handler run as fast as it can
426 reset_timing_run_main();
429 PBD::StandardTimer fast_timer (fast_timer_ms (), m_context);
430 sigc::connection fast_connection = fast_timer.connect (sigc::mem_fun (this, &TimerTest::on_fast_timeout));
432 reset_timing_run_main();
434 PBD::StandardTimer rapid1_timer (rapid1_timer_ms (), m_context);
435 sigc::connection rapid1_connection = rapid1_timer.connect (sigc::mem_fun (this, &TimerTest::on_rapid1_timeout));
437 reset_timing_run_main();
439 PBD::StandardTimer rapid2_timer (rapid2_timer_ms (), m_context);
440 sigc::connection rapid2_connection = rapid2_timer.connect (sigc::mem_fun (this, &TimerTest::on_rapid2_timeout));
442 reset_timing_run_main();
446 TimerTest::testTimersIdleFrequency ()
448 m_current_test_name = "testTimersIdleFrequency";
449 _testTimersIdleFrequency ();
453 TimerTest::_testTimersIdleFrequency ()
455 m_block_idle = false;
456 m_connect_idle = true;
460 m_block_idle = false;
461 m_connect_idle = false;
465 TimerTest::testTimersBlockIdle ()
467 m_current_test_name = "testTimersBlockIdle";
468 _testTimersBlockIdle ();
472 TimerTest::_testTimersBlockIdle ()
475 m_connect_idle = true;
479 m_block_idle = false;
480 m_connect_idle = false;
483 #ifdef PLATFORM_WINDOWS
485 TimerTest::testGlibTimeoutSourcesHR ()
487 CPPUNIT_ASSERT(set_min_timer_resolution());
489 m_current_test_name = "testGlibTimeoutSourcesHR";
490 _testGlibTimeoutSources ();
492 CPPUNIT_ASSERT(reset_timer_resolution());
496 TimerTest::testGlibmmSignalTimeoutsHR ()
498 CPPUNIT_ASSERT(set_min_timer_resolution());
500 m_current_test_name = "testGlibmmSignalTimeoutsHR";
501 _testGlibmmSignalTimeouts ();
503 CPPUNIT_ASSERT(reset_timer_resolution());
507 TimerTest::testGlibmmTimeoutSourcesHR ()
509 CPPUNIT_ASSERT(set_min_timer_resolution());
511 m_current_test_name = "testGlibmmTimeoutSourcesHR";
512 _testGlibmmTimeoutSources ();
514 CPPUNIT_ASSERT(reset_timer_resolution());
518 TimerTest::testTimersHR ()
520 CPPUNIT_ASSERT(set_min_timer_resolution());
522 m_current_test_name = "testTimersHR";
525 CPPUNIT_ASSERT(reset_timer_resolution());
529 TimerTest::testTimersIdleFrequencyHR ()
531 CPPUNIT_ASSERT(set_min_timer_resolution());
533 m_current_test_name = "testTimersIdleFrequencyHR";
534 _testTimersIdleFrequency ();
536 CPPUNIT_ASSERT(reset_timer_resolution());
540 TimerTest::testTimersBlockIdleHR ()
542 CPPUNIT_ASSERT(set_min_timer_resolution());
544 m_current_test_name = "testTimersIdleFrequencyHR";
545 _testTimersBlockIdle ();
547 CPPUNIT_ASSERT(reset_timer_resolution());