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]

Reply via email to