added the PN_REACTOR_QUIESCED event
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/255946d1 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/255946d1 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/255946d1 Branch: refs/heads/master Commit: 255946d1ca5bb814a8068b4f5b86dfb4e0610d36 Parents: 6df8ad3 Author: Rafael Schloming <[email protected]> Authored: Tue Jan 20 17:06:21 2015 -0500 Committer: Rafael Schloming <[email protected]> Committed: Wed Jan 21 09:03:44 2015 -0500 ---------------------------------------------------------------------- proton-c/bindings/python/proton/__init__.py | 1 + proton-c/include/proton/event.h | 6 +++++ proton-c/src/events/event.c | 2 ++ proton-c/src/reactor/reactor.c | 23 ++++++++++++++------ proton-c/src/tests/reactor.c | 22 ++++++++++--------- .../org/apache/qpid/proton/engine/Event.java | 1 + proton-j/src/main/resources/cengine.py | 1 + 7 files changed, 39 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-c/bindings/python/proton/__init__.py ---------------------------------------------------------------------- diff --git a/proton-c/bindings/python/proton/__init__.py b/proton-c/bindings/python/proton/__init__.py index 0516b65..22ffa6d 100644 --- a/proton-c/bindings/python/proton/__init__.py +++ b/proton-c/bindings/python/proton/__init__.py @@ -3316,6 +3316,7 @@ def _none(x): return None class Event(Wrapper, EventBase): REACTOR_INIT = EventType(PN_REACTOR_INIT, "on_reactor_init") + REACTOR_QUIESCED = EventType(PN_REACTOR_QUIESCED, "on_reactor_quiesced") REACTOR_FINAL = EventType(PN_REACTOR_FINAL, "on_reactor_final") TIMER_TASK = EventType(PN_TIMER_TASK, "on_timer_task") http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-c/include/proton/event.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/event.h b/proton-c/include/proton/event.h index 2a28dd2..a4d3d52 100644 --- a/proton-c/include/proton/event.h +++ b/proton-c/include/proton/event.h @@ -93,6 +93,12 @@ typedef enum { PN_REACTOR_INIT, /** + * A reactor has no more events to process. Events of this type + * point to the reactor. + */ + PN_REACTOR_QUIESCED, + + /** * A reactor has been stopped. Events of this type point to the reactor. */ PN_REACTOR_FINAL, http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-c/src/events/event.c ---------------------------------------------------------------------- diff --git a/proton-c/src/events/event.c b/proton-c/src/events/event.c index 9b98aa1..54ef92f 100644 --- a/proton-c/src/events/event.c +++ b/proton-c/src/events/event.c @@ -258,6 +258,8 @@ const char *pn_event_type_name(pn_event_type_t type) return "PN_EVENT_NONE"; case PN_REACTOR_INIT: return "PN_REACTOR_INIT"; + case PN_REACTOR_QUIESCED: + return "PN_REACTOR_QUIESCED"; case PN_REACTOR_FINAL: return "PN_REACTOR_FINAL"; case PN_TIMER_TASK: http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-c/src/reactor/reactor.c ---------------------------------------------------------------------- diff --git a/proton-c/src/reactor/reactor.c b/proton-c/src/reactor/reactor.c index b9346d2..a4f4b31 100644 --- a/proton-c/src/reactor/reactor.c +++ b/proton-c/src/reactor/reactor.c @@ -45,6 +45,7 @@ struct pn_reactor_t { pn_list_t *children; pn_timer_t *timer; pn_selectable_t *selectable; + pn_event_type_t previous; pn_timestamp_t now; bool selected; }; @@ -70,6 +71,7 @@ static void pn_reactor_initialize(pn_reactor_t *reactor) { reactor->children = pn_list(PN_OBJECT, 0); reactor->timer = pn_timer(reactor->collector); reactor->selectable = NULL; + reactor->previous = PN_EVENT_NONE; reactor->selected = false; pn_reactor_mark(reactor); } @@ -320,13 +322,20 @@ pn_task_t *pn_reactor_schedule(pn_reactor_t *reactor, int delay, pn_handler_t *h void pn_reactor_process(pn_reactor_t *reactor) { assert(reactor); pn_reactor_mark(reactor); - pn_event_t *event; - while ((event = pn_collector_peek(reactor->collector))) { - pni_reactor_dispatch_pre(reactor, event); - pn_handler_t *handler = pn_event_handler(event, reactor->handler); - pn_handler_dispatch(handler, event); - pni_reactor_dispatch_post(reactor, event); - pn_collector_pop(reactor->collector); + while (true) { + pn_event_t *event = pn_collector_peek(reactor->collector); + if (event) { + pni_reactor_dispatch_pre(reactor, event); + pn_handler_t *handler = pn_event_handler(event, reactor->handler); + pn_handler_dispatch(handler, event); + pni_reactor_dispatch_post(reactor, event); + reactor->previous = pn_event_type(event); + pn_collector_pop(reactor->collector); + } else if (reactor->previous != PN_REACTOR_QUIESCED && reactor->previous != PN_REACTOR_FINAL) { + pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_QUIESCED); + } else { + break; + } } } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-c/src/tests/reactor.c ---------------------------------------------------------------------- diff --git a/proton-c/src/tests/reactor.c b/proton-c/src/tests/reactor.c index dc61274..1365f88 100644 --- a/proton-c/src/tests/reactor.c +++ b/proton-c/src/tests/reactor.c @@ -137,8 +137,8 @@ static void test_reactor_handler_run(void) { pn_handler_t *th = test_handler(reactor, events); pn_handler_add(handler, th); pn_reactor_run(reactor); - expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_SELECTABLE_UPDATED, - PN_SELECTABLE_FINAL, PN_REACTOR_FINAL, END); + expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_REACTOR_QUIESCED, + PN_SELECTABLE_UPDATED, PN_SELECTABLE_FINAL, PN_REACTOR_QUIESCED, PN_REACTOR_FINAL, END); pn_free(reactor); pn_free(th); pn_free(events); @@ -152,8 +152,8 @@ static void test_reactor_handler_run_free(void) { pn_list_t *events = pn_list(PN_VOID, 0); pn_handler_add(handler, test_handler(reactor, events)); pn_reactor_run(reactor); - expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_SELECTABLE_UPDATED, - PN_SELECTABLE_FINAL, PN_REACTOR_FINAL, END); + expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_REACTOR_QUIESCED, + PN_SELECTABLE_UPDATED, PN_SELECTABLE_FINAL, PN_REACTOR_QUIESCED, PN_REACTOR_FINAL, END); pn_reactor_free(reactor); pn_free(events); } @@ -169,8 +169,8 @@ static void test_reactor_connection(void) { pn_list_t *revents = pn_list(PN_VOID, 0); pn_handler_add(root, test_handler(reactor, revents)); pn_reactor_run(reactor); - expect(revents, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_SELECTABLE_UPDATED, - PN_SELECTABLE_FINAL, PN_REACTOR_FINAL, END); + expect(revents, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_REACTOR_QUIESCED, + PN_SELECTABLE_UPDATED, PN_SELECTABLE_FINAL, PN_REACTOR_QUIESCED, PN_REACTOR_FINAL, END); expect(cevents, PN_CONNECTION_INIT, END); pn_reactor_free(reactor); pn_handler_free(tch); @@ -419,8 +419,9 @@ static void test_reactor_schedule(void) { pn_reactor_schedule(reactor, 0, NULL); pn_reactor_run(reactor); pn_reactor_free(reactor); - expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_TIMER_TASK, - PN_SELECTABLE_UPDATED, PN_SELECTABLE_FINAL, PN_REACTOR_FINAL, END); + expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_REACTOR_QUIESCED, + PN_TIMER_TASK, PN_REACTOR_QUIESCED, PN_SELECTABLE_UPDATED, PN_SELECTABLE_FINAL, PN_REACTOR_QUIESCED, + PN_REACTOR_FINAL, END); pn_free(events); } @@ -435,8 +436,9 @@ static void test_reactor_schedule_handler(void) { pn_reactor_run(reactor); pn_reactor_free(reactor); pn_handler_free(th); - expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_SELECTABLE_UPDATED, - PN_SELECTABLE_FINAL, PN_REACTOR_FINAL, END); + expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED, PN_REACTOR_QUIESCED, + PN_REACTOR_QUIESCED, PN_SELECTABLE_UPDATED, PN_SELECTABLE_FINAL, PN_REACTOR_QUIESCED, + PN_REACTOR_FINAL, END); expect(tevents, PN_TIMER_TASK, END); pn_free(events); pn_free(tevents); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java index ed3a421..ebbf648 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java @@ -31,6 +31,7 @@ public interface Event public enum Type { REACTOR_INIT, + REACTOR_QUIESCED, REACTOR_FINAL, TIMER_TASK, http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/255946d1/proton-j/src/main/resources/cengine.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/cengine.py b/proton-j/src/main/resources/cengine.py index 75624c9..69fe4dd 100644 --- a/proton-j/src/main/resources/cengine.py +++ b/proton-j/src/main/resources/cengine.py @@ -951,6 +951,7 @@ def pn_transport_condition(trans): from org.apache.qpid.proton.engine import Event PN_REACTOR_INIT = Event.Type.REACTOR_INIT +PN_REACTOR_QUIESCED = Event.Type.REACTOR_QUIESCED PN_REACTOR_FINAL = Event.Type.REACTOR_FINAL PN_TIMER_TASK = Event.Type.TIMER_TASK --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
