NO-JIRA: Add pn_event_root to proton-c
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/529fc5d1 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/529fc5d1 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/529fc5d1 Branch: refs/heads/proton-go Commit: 529fc5d1ff3145cc618c0fcb796a3f0e2f5ae7ae Parents: ef36bd6 Author: Bozo Dragojevic <[email protected]> Authored: Mon Sep 28 12:33:36 2015 +0200 Committer: Bozo Dragojevic <[email protected]> Committed: Mon Sep 28 13:01:24 2015 +0200 ---------------------------------------------------------------------- proton-c/include/proton/event.h | 5 +++++ proton-c/include/proton/reactor.h | 1 - proton-c/include/proton/types.h | 9 +++++++++ proton-c/src/events/event.c | 12 +++++++++++- proton-c/src/reactor/reactor.c | 2 ++ proton-c/src/reactor/reactor.h | 2 +- proton-c/src/tests/reactor.c | 31 +++++++++++++++++++++++++++++++ 7 files changed, 59 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/include/proton/event.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/event.h b/proton-c/include/proton/event.h index d10927b..16d2bda 100644 --- a/proton-c/include/proton/event.h +++ b/proton-c/include/proton/event.h @@ -415,6 +415,11 @@ PN_EXTERN const pn_class_t *pn_event_class(pn_event_t *event); PN_EXTERN void *pn_event_context(pn_event_t *event); /** + * Get the root handler the current event was dispatched to. + */ +PN_EXTERN pn_handler_t *pn_event_root(pn_event_t *event); + +/** * Get the connection associated with an event. * * @param[in] event an event object http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/include/proton/reactor.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/reactor.h b/proton-c/include/proton/reactor.h index ed223e7..0ac6f32 100644 --- a/proton-c/include/proton/reactor.h +++ b/proton-c/include/proton/reactor.h @@ -41,7 +41,6 @@ extern "C" { * @{ */ -typedef struct pn_handler_t pn_handler_t; typedef struct pn_reactor_t pn_reactor_t; typedef struct pn_acceptor_t pn_acceptor_t; typedef struct pn_timer_t pn_timer_t; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/include/proton/types.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/types.h b/proton-c/include/proton/types.h index 08d3f54..10799ff 100644 --- a/proton-c/include/proton/types.h +++ b/proton-c/include/proton/types.h @@ -255,6 +255,15 @@ typedef struct pn_collector_t pn_collector_t; typedef struct pn_transport_t pn_transport_t; +/** + * An event handler + * + * A pn_handler_t is target of ::pn_event_t dispatched by the ::pn_reactor_t + * + * @ingroup reactor + */ +typedef struct pn_handler_t pn_handler_t; + /** @} */ #ifdef __cplusplus http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/src/events/event.c ---------------------------------------------------------------------- diff --git a/proton-c/src/events/event.c b/proton-c/src/events/event.c index 42d4e31..5ad718e 100644 --- a/proton-c/src/events/event.c +++ b/proton-c/src/events/event.c @@ -18,9 +18,10 @@ * under the License. * */ - +#include <stdio.h> #include <proton/object.h> #include <proton/event.h> +#include <proton/reactor.h> #include <assert.h> struct pn_collector_t { @@ -283,7 +284,16 @@ pn_record_t *pn_event_attachments(pn_event_t *event) return event->attachments; } +pn_handler_t *pn_event_root(pn_event_t *event) +{ + assert(event); + pn_handler_t *h = pn_record_get_handler(event->attachments); + return h; +} +void pni_event_set_root(pn_event_t *event, pn_handler_t *handler) { + pn_record_set_handler(event->attachments, handler); +} const char *pn_event_type_name(pn_event_type_t type) { http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/src/reactor/reactor.c ---------------------------------------------------------------------- diff --git a/proton-c/src/reactor/reactor.c b/proton-c/src/reactor/reactor.c index cd709b1..6b328bc 100644 --- a/proton-c/src/reactor/reactor.c +++ b/proton-c/src/reactor/reactor.c @@ -398,7 +398,9 @@ bool pn_reactor_process(pn_reactor_t *reactor) { pn_incref(event); pn_handler_t *handler = pn_event_handler(event, reactor->handler); pn_event_type_t type = pn_event_type(event); + pni_event_set_root(event, handler); pn_handler_dispatch(handler, event, type); + pni_event_set_root(event, reactor->global); pn_handler_dispatch(reactor->global, event, type); pni_reactor_dispatch_post(reactor, event); previous = reactor->previous = type; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/src/reactor/reactor.h ---------------------------------------------------------------------- diff --git a/proton-c/src/reactor/reactor.h b/proton-c/src/reactor/reactor.h index 689df81..f996dca 100644 --- a/proton-c/src/reactor/reactor.h +++ b/proton-c/src/reactor/reactor.h @@ -25,6 +25,6 @@ #include <proton/reactor.h> void pni_record_init_reactor(pn_record_t *record, pn_reactor_t *reactor); - +void pni_event_set_root(pn_event_t *event, pn_handler_t *handler); #endif /* src/reactor.h */ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/529fc5d1/proton-c/src/tests/reactor.c ---------------------------------------------------------------------- diff --git a/proton-c/src/tests/reactor.c b/proton-c/src/tests/reactor.c index 059d099..1e706e2 100644 --- a/proton-c/src/tests/reactor.c +++ b/proton-c/src/tests/reactor.c @@ -82,6 +82,21 @@ pn_handler_t *test_handler(pn_reactor_t *reactor, pn_list_t *events) { return handler; } + +void root_dispatch(pn_handler_t *handler, pn_event_t *event, pn_event_type_t type) { + pni_test_handler_t *th = thmem(handler); + pn_reactor_t *reactor = pn_event_reactor(event); + assert(reactor == th->reactor); + pn_list_add(th->events, pn_event_root(event)); +} + +pn_handler_t *test_root(pn_reactor_t *reactor, pn_list_t *events) { + pn_handler_t *handler = pn_handler_new(root_dispatch, sizeof(pni_test_handler_t), NULL); + thmem(handler)->reactor = reactor; + thmem(handler)->events = events; + return handler; +} + #define END PN_EVENT_NONE void expect(pn_list_t *events, ...) { @@ -156,6 +171,21 @@ static void test_reactor_handler_run_free(void) { pn_free(events); } +static void test_reactor_event_root(void) { + pn_reactor_t *reactor = pn_reactor(); + assert(reactor); + pn_handler_t *handler = pn_reactor_get_handler(reactor); + assert(handler); + pn_list_t *roots = pn_list(PN_VOID, 0); + pn_handler_t *th = test_root(reactor, roots); + pn_handler_add(handler, th); + pn_reactor_run(reactor); + expect(roots, handler, handler, handler, handler, handler, END); + pn_free(reactor); + pn_free(th); + pn_free(roots); +} + static void test_reactor_connection(void) { pn_reactor_t *reactor = pn_reactor(); assert(reactor); @@ -456,6 +486,7 @@ static void test_reactor_schedule_cancel(void) { int main(int argc, char **argv) { + test_reactor_event_root(); test_reactor(); test_reactor_free(); test_reactor_run(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
