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/21 15:11:08 UTC

[2/2] qpid-proton git commit: added the PN_REACTOR_QUIESCED event

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 <rh...@alum.mit.edu>
Authored: Tue Jan 20 17:06:21 2015 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org