You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2017/07/21 17:02:14 UTC

[18/20] qpid-proton git commit: PROTON-1482: [C++ binding] Added convenience overload to proton::defer for scheduled deferred work - Used new conveniences in scheduled_send_03 example

PROTON-1482: [C++ binding] Added convenience overload to proton::defer
for scheduled deferred work
- Used new conveniences in scheduled_send_03 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/1e2efdb0
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/1e2efdb0
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/1e2efdb0

Branch: refs/heads/master
Commit: 1e2efdb01c8ebf863626150c9c14eae600c4739c
Parents: 88c2d7d
Author: Andrew Stitcher <as...@apache.org>
Authored: Fri May 19 01:38:18 2017 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Fri Jul 21 12:50:06 2017 -0400

----------------------------------------------------------------------
 examples/cpp/scheduled_send_03.cpp              | 50 +++-----------------
 .../bindings/cpp/include/proton/work_queue.hpp  | 31 ++++++++++++
 2 files changed, 37 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e2efdb0/examples/cpp/scheduled_send_03.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/scheduled_send_03.cpp b/examples/cpp/scheduled_send_03.cpp
index c3c63c8..8ac46a1 100644
--- a/examples/cpp/scheduled_send_03.cpp
+++ b/examples/cpp/scheduled_send_03.cpp
@@ -46,49 +46,13 @@ class scheduled_sender : public proton::messaging_handler {
     proton::work_queue *work_queue;
     bool ready, canceled;
 
-    struct cancel_fn : public proton::void_function0 {
-        scheduled_sender* parent;
-        proton::sender sender;
-        cancel_fn(): parent(0) {}
-        cancel_fn(scheduled_sender& ss, proton::sender& s) : parent(&ss), sender(s) {}
-        void operator()() { if (parent) parent->cancel(sender); }
-    };
-
-    struct tick_fn : public proton::void_function0 {
-        scheduled_sender* parent;
-        proton::sender sender;
-        tick_fn(): parent(0) {}
-        tick_fn(scheduled_sender& ss, proton::sender& s) : parent(&ss), sender(s) {}
-        void operator()() { if (parent) parent->tick(sender); }
-    };
-
-    struct defer_cancel_fn : public proton::void_function0 {
-        scheduled_sender& parent;
-        defer_cancel_fn(scheduled_sender& ss) : parent(ss) {}
-        void operator()() { parent.work_queue->add(parent.do_cancel); }
-    };
-
-    struct defer_tick_fn : public proton::void_function0 {
-        scheduled_sender& parent;
-        defer_tick_fn(scheduled_sender& ss) : parent(ss) {}
-        void operator()() { parent.work_queue->add(parent.do_tick); }
-    };
-
-    tick_fn do_tick;
-    cancel_fn do_cancel;
-    defer_tick_fn defer_tick;
-    defer_cancel_fn defer_cancel;
-
   public:
-
     scheduled_sender(const std::string &s, double d, double t) :
         url(s),
         interval(int(d*proton::duration::SECOND.milliseconds())), // Send interval.
         timeout(int(t*proton::duration::SECOND.milliseconds())), // Cancel after timeout.
         ready(true),            // Ready to send.
-        canceled(false),         // Canceled.
-        defer_tick(*this),
-        defer_cancel(*this)
+        canceled(false)         // Canceled.
     {}
 
     void on_container_start(proton::container &c) OVERRIDE {
@@ -98,20 +62,18 @@ class scheduled_sender : public proton::messaging_handler {
     void on_sender_open(proton::sender & s) OVERRIDE {
         work_queue = &s.work_queue();
 
-        do_cancel = cancel_fn(*this, s);
-        do_tick = tick_fn(*this, s);
-        s.container().schedule(timeout, defer_cancel); // Call this->cancel after timeout.
-        s.container().schedule(interval, defer_tick); // Start regular ticks every interval.
+        proton::defer(work_queue, timeout, &scheduled_sender::cancel, this, s);
+        proton::defer(work_queue, interval, &scheduled_sender::tick, this, s);
     }
 
-    void cancel(proton::sender& sender) {
+    void cancel(proton::sender sender) {
         canceled = true;
         sender.connection().close();
     }
 
-    void tick(proton::sender& sender) {
+    void tick(proton::sender sender) {
         if (!canceled) {
-            sender.container().schedule(interval, defer_tick); // Next tick
+            proton::defer(work_queue, interval, &scheduled_sender::tick, this, sender); // Next tick
             if (sender.credit() > 0) // Only send if we have credit
                 send(sender);
             else

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e2efdb0/proton-c/bindings/cpp/include/proton/work_queue.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/work_queue.hpp b/proton-c/bindings/cpp/include/proton/work_queue.hpp
index bef041c..61567b8 100644
--- a/proton-c/bindings/cpp/include/proton/work_queue.hpp
+++ b/proton-c/bindings/cpp/include/proton/work_queue.hpp
@@ -22,6 +22,7 @@
  *
  */
 
+#include "./duration.hpp"
 #include "./fwd.hpp"
 #include "./function.hpp"
 #include "./internal/config.hpp"
@@ -317,6 +318,31 @@ bool defer(WQ wq, F f, A a, B b, C c, D d) {
     return defer_helper(wq, make_work(f, a, b, c, d));
 }
 
+template <class WQ, class F>
+void defer(WQ wq, duration dn, F f) {
+    wq->schedule(dn, make_work(f));
+}
+
+template <class WQ, class F, class A>
+void defer(WQ wq, duration dn, F f, A a) {
+    wq->schedule(dn, make_work(f, a));
+}
+
+template <class WQ, class F, class A, class B>
+void defer(WQ wq, duration dn, F f, A a, B b) {
+    wq->schedule(dn, make_work(f, a, b));
+}
+
+template <class WQ, class F, class A, class B, class C>
+void defer(WQ wq, duration dn, F f, A a, B b, C c) {
+    wq->schedule(dn, make_work(f, a, b, c));
+}
+
+template <class WQ, class F, class A, class B, class C, class D>
+void defer(WQ wq, duration dn, F f, A a, B b, C c, D d) {
+    wq->schedule(dn, make_work(f, a, b, c, d));
+}
+
 /// This version of proton::defer defers calling a free function to an arbitrary work queue
 #else
 // The C++11 version is *much* simpler and even so more general!
@@ -326,6 +352,11 @@ bool defer(WQ wq, Rest&&... r) {
     return wq->add(std::bind(std::forward<Rest>(r)...));
 }
 
+template <class WQ, class... Rest>
+void defer(WQ wq, duration d, Rest&&... r) {
+    wq->schedule(d, std::bind(std::forward<Rest>(r)...));
+}
+
 template <class... Rest>
 work make_work(Rest&&... r) {
     return std::bind(std::forward<Rest>(r)...);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org