NO-JIRA: c++: Speed up recurring_timer example.
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b131dc19 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b131dc19 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b131dc19 Branch: refs/heads/go1 Commit: b131dc199f7f2c69a14587e45b6feaf741b53610 Parents: 1b1b2e5 Author: Alan Conway <[email protected]> Authored: Thu Nov 5 10:22:49 2015 -0500 Committer: Alan Conway <[email protected]> Committed: Tue Nov 10 17:06:27 2015 -0500 ---------------------------------------------------------------------- examples/cpp/CMakeLists.txt | 2 +- examples/cpp/example_test.py | 17 ++++++++++++++--- examples/cpp/recurring_timer.cpp | 29 ++++++++++++++--------------- 3 files changed, 29 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b131dc19/examples/cpp/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt index 3e5dafe..8916963 100644 --- a/examples/cpp/CMakeLists.txt +++ b/examples/cpp/CMakeLists.txt @@ -60,7 +60,7 @@ else(WIN32) endif(WIN32) add_test(NAME cpp_example_test - COMMAND ${PYTHON_EXECUTABLE} ${env_py} -- "PATH=${test_path}" "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}" ${VALGRIND_ENV} ${PYTHON_EXECUTABLE} -m unittest -v example_test) + COMMAND ${PYTHON_EXECUTABLE} ${env_py} -- "PATH=${test_path}" ${VALGRIND_ENV} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example_test.py -v) set(broker_tests example_test.ExampleTest.test_request_response example_test.ExampleTest.test_simple_send_recv) http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b131dc19/examples/cpp/example_test.py ---------------------------------------------------------------------- diff --git a/examples/cpp/example_test.py b/examples/cpp/example_test.py index 3ed8b9c..f51cf57 100644 --- a/examples/cpp/example_test.py +++ b/examples/cpp/example_test.py @@ -23,6 +23,7 @@ import unittest import os, sys, socket, time from random import randrange from subprocess import Popen, PIPE, STDOUT +from copy import copy import platform def cmdline(*args): @@ -215,14 +216,24 @@ Values: map{string(k1):int(42), symbol(k2):boolean(false)} self.assertEqual(expect, execute("encode_decode")) def test_recurring_timer(self): - expect="""Tick... + # Disable valgrind, this test is time-sensitive. + env = {k: v for k,v in os.environ.iteritems() if k != "VALGRIND"} + env, os.environ = os.environ, env + try: + expect="""Tick... +Tick... +Tock... +Tick... +Tock... Tick... Tock... Tick... Tock... """ - self.maxDiff = None - self.assertEqual(expect, execute("recurring_timer", "-t", "3")) + self.maxDiff = None + self.assertEqual(expect, execute("recurring_timer", "-t", ".01", "-k", ".001")) + finally: + os.environ = env # Restore environment if __name__ == "__main__": unittest.main() http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b131dc19/examples/cpp/recurring_timer.cpp ---------------------------------------------------------------------- diff --git a/examples/cpp/recurring_timer.cpp b/examples/cpp/recurring_timer.cpp index b6141fd..37cbfed 100644 --- a/examples/cpp/recurring_timer.cpp +++ b/examples/cpp/recurring_timer.cpp @@ -43,53 +43,52 @@ class tocker : public proton::messaging_handler { class recurring : public proton::messaging_handler { private: - int remaining_secs; + int remaining_msecs, tick_ms; ticker tick_handler; tocker tock_handler; proton::task *cancel_task; public: - recurring(int secs) : remaining_secs(secs), cancel_task(0) {} + recurring(int msecs, int tickms) : remaining_msecs(msecs), tick_ms(tickms), cancel_task(0) {} proton::task& ticktock(proton::event &e) { // Show timer events in separate handlers. - e.container().schedule(250, &tick_handler); - return e.container().schedule(750, &tock_handler); + e.container().schedule(tick_ms, &tick_handler); + return e.container().schedule(tick_ms * 3, &tock_handler); } void on_start(proton::event &e) { - if (remaining_secs <= 0) + if (remaining_msecs <= 0) return; proton::task& first_tock = ticktock(e); - e.container().schedule(1000); - remaining_secs--; // Show a cancel operation. cancel_task = &first_tock; - e.container().schedule(500); + e.container().schedule(tick_ms); } void on_timer_task(proton::event &e) { if (cancel_task) { cancel_task->cancel(); cancel_task = 0; - return; } - if (remaining_secs) { + remaining_msecs -= tick_ms * 2; + if (remaining_msecs > 0) { ticktock(e); - e.container().schedule(1000); - remaining_secs--; + e.container().schedule(tick_ms * 4); } } }; int main(int argc, char **argv) { // Command line options - int running_time_in_secs = 5; + double running_time = 5; + double tick = 0.25; options opts(argc, argv); - opts.add_value(running_time_in_secs, 't', "running time", "running time in seconds", "RUNTIME"); + opts.add_value(running_time, 't', "running time", "running time in seconds", "RUNTIME"); + opts.add_value(tick, 'k', "tick time", "tick time as fraction of second", "TICK"); try { opts.parse(); - recurring recurring_handler(running_time_in_secs); + recurring recurring_handler(running_time * 1000, tick * 1000); proton::container(recurring_handler).run(); return 0; } catch (const bad_option& e) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
