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