You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2015/01/23 14:21:04 UTC

qpid-proton git commit: added selectable scoped handler to dispatch logic; added convenience macro for defining handles

Repository: qpid-proton
Updated Branches:
  refs/heads/master 4030a41f8 -> 71d75e953


added selectable scoped handler to dispatch logic; added convenience macro for defining handles


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/71d75e95
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/71d75e95
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/71d75e95

Branch: refs/heads/master
Commit: 71d75e9532b3c84513b41de094c00f0499bd0c25
Parents: 4030a41
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Fri Jan 23 07:57:55 2015 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Fri Jan 23 08:19:44 2015 -0500

----------------------------------------------------------------------
 proton-c/bindings/python/proton/reactors.py | 10 ++++++++--
 proton-c/include/proton/object.h            |  4 ++++
 proton-c/src/reactor/acceptor.c             |  8 ++++++--
 proton-c/src/reactor/connection.c           |  3 +--
 proton-c/src/reactor/reactor.c              | 20 ++++++++++++--------
 5 files changed, 31 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/71d75e95/proton-c/bindings/python/proton/reactors.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton/reactors.py b/proton-c/bindings/python/proton/reactors.py
index d0b8b47..4e2664a 100644
--- a/proton-c/bindings/python/proton/reactors.py
+++ b/proton-c/bindings/python/proton/reactors.py
@@ -937,8 +937,14 @@ class Reactor(Wrapper):
         pn_decref(impl)
         return result
 
-    def selectable(self):
-        return Selectable.wrap(pn_reactor_selectable(self._impl))
+    def selectable(self, handler=None):
+        impl = _chandler(handler, self.errors)
+        result = Selectable.wrap(pn_reactor_selectable(self._impl))
+        if impl:
+            record = pn_selectable_attachments(result._impl)
+            pn_record_set_handler(record, impl)
+            pn_decref(impl)
+        return result
 
     def update(self, sel):
         pn_reactor_update(self._impl, sel._impl)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/71d75e95/proton-c/include/proton/object.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/object.h b/proton-c/include/proton/object.h
index 1d7c1df..48d2872 100644
--- a/proton-c/include/proton/object.h
+++ b/proton-c/include/proton/object.h
@@ -259,6 +259,10 @@ PN_EXTERN void *pn_iterator_next(pn_iterator_t *iterator);
 
 #define PN_LEGCTX ((pn_handle_t) 0)
 
+#define PN_HANDLE(name) \
+  static char *_PN_HANDLE_ ## name = 0; \
+  static pn_handle_t name = ((pn_handle_t) &_PN_HANDLE_ ## name);
+
 PN_EXTERN pn_record_t *pn_record(void);
 PN_EXTERN void pn_record_def(pn_record_t *record, pn_handle_t key, const pn_class_t *clazz);
 PN_EXTERN bool pn_record_has(pn_record_t *record, pn_handle_t key);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/71d75e95/proton-c/src/reactor/acceptor.c
----------------------------------------------------------------------
diff --git a/proton-c/src/reactor/acceptor.c b/proton-c/src/reactor/acceptor.c
index 8800048..d44938f 100644
--- a/proton-c/src/reactor/acceptor.c
+++ b/proton-c/src/reactor/acceptor.c
@@ -28,11 +28,13 @@
 
 pn_selectable_t *pn_reactor_selectable_transport(pn_reactor_t *reactor, pn_socket_t sock, pn_transport_t *transport);
 
+PN_HANDLE(PNI_ACCEPTOR_HANDLER)
+
 void pni_acceptor_readable(pn_selectable_t *sel) {
   pn_reactor_t *reactor = (pn_reactor_t *) pni_selectable_get_context(sel);
   char name[1024];
   pn_socket_t sock = pn_accept(pn_reactor_io(reactor), pn_selectable_get_fd(sel), name, 1024);
-  pn_handler_t *handler = pn_record_get_handler(pn_selectable_attachments(sel));
+  pn_handler_t *handler = (pn_handler_t *) pn_record_get(pn_selectable_attachments(sel), PNI_ACCEPTOR_HANDLER);
   if (!handler) { handler = pn_reactor_handler(reactor); }
   pn_connection_t *conn = pn_reactor_connection(reactor, handler);
   pn_transport_t *trans = pn_transport();
@@ -63,7 +65,9 @@ pn_acceptor_t *pn_reactor_acceptor(pn_reactor_t *reactor, const char *host, cons
   pn_selectable_on_readable(sel, pni_acceptor_readable);
   pn_selectable_on_finalize(sel, pni_acceptor_finalize);
   pni_record_init_reactor(pn_selectable_attachments(sel), reactor);
-  pn_record_set_handler(pn_selectable_attachments(sel), handler);
+  pn_record_t *record = pn_selectable_attachments(sel);
+  pn_record_def(record, PNI_ACCEPTOR_HANDLER, PN_OBJECT);
+  pn_record_set(record, PNI_ACCEPTOR_HANDLER, handler);
   pn_selectable_set_reading(sel, true);
   pn_reactor_update(reactor, sel);
   return (pn_acceptor_t *) sel;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/71d75e95/proton-c/src/reactor/connection.c
----------------------------------------------------------------------
diff --git a/proton-c/src/reactor/connection.c b/proton-c/src/reactor/connection.c
index b427675..dfaa466 100644
--- a/proton-c/src/reactor/connection.c
+++ b/proton-c/src/reactor/connection.c
@@ -30,8 +30,7 @@
 #include "reactor.h"
 
 // XXX: overloaded for both directions
-static void *pni_transportctx = NULL;
-#define PN_TRANCTX ((pn_handle_t) &pni_transportctx)
+PN_HANDLE(PN_TRANCTX)
 
 static pn_transport_t *pni_transport(pn_selectable_t *sel) {
   pn_record_t *record = pn_selectable_attachments(sel);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/71d75e95/proton-c/src/reactor/reactor.c
----------------------------------------------------------------------
diff --git a/proton-c/src/reactor/reactor.c b/proton-c/src/reactor/reactor.c
index d576ca4..238caf3 100644
--- a/proton-c/src/reactor/reactor.c
+++ b/proton-c/src/reactor/reactor.c
@@ -161,9 +161,7 @@ pn_selectable_t *pn_reactor_selectable(pn_reactor_t *reactor) {
   return sel;
 }
 
-static void *pni_terminated = NULL;
-
-#define PNI_TERMINATED ((pn_handle_t) &pni_terminated)
+PN_HANDLE(PNI_TERMINATED)
 
 void pn_reactor_update(pn_reactor_t *reactor, pn_selectable_t *selectable) {
   assert(reactor);
@@ -204,8 +202,7 @@ static void pni_reactor_dispatch_post(pn_reactor_t *reactor, pn_event_t *event)
   }
 }
 
-static void *pni_handler = NULL;
-#define PN_HANDLER ((pn_handle_t) &pni_handler)
+PN_HANDLE(PN_HANDLER)
 
 pn_handler_t *pn_record_get_handler(pn_record_t *record) {
   assert(record);
@@ -218,8 +215,7 @@ void pn_record_set_handler(pn_record_t *record, pn_handler_t *handler) {
   pn_record_set(record, PN_HANDLER, handler);
 }
 
-static void *pni_reactor_handle = NULL;
-#define PN_REACTOR ((pn_handle_t) &pni_reactor_handle)
+PN_HANDLE(PN_REACTOR)
 
 pn_reactor_t *pni_record_get_reactor(pn_record_t *record) {
   return (pn_reactor_t *) pn_record_get(record, PN_REACTOR);
@@ -297,9 +293,17 @@ pn_handler_t *pn_event_handler(pn_event_t *event, pn_handler_t *default_handler)
     handler = pn_record_get_handler(pn_connection_attachments(connection));
     if (handler) { return handler; }
   }
-  if (pn_class_id(pn_event_class(event)) == CID_pn_task) {
+  switch (pn_class_id(pn_event_class(event))) {
+  case CID_pn_task:
     handler = pn_record_get_handler(pn_task_attachments((pn_task_t *) pn_event_context(event)));
     if (handler) { return handler; }
+    break;
+  case CID_pn_selectable:
+    handler = pn_record_get_handler(pn_selectable_attachments((pn_selectable_t *) pn_event_context(event)));
+    if (handler) { return handler; }
+    break;
+  default:
+    break;
   }
   return default_handler;
 }


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