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]

Reply via email to