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 <[email protected]> Authored: Fri Jan 23 07:57:55 2015 -0500 Committer: Rafael Schloming <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
