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 2014/07/17 21:51:35 UTC

svn commit: r1611450 - in /qpid/proton/trunk: proton-c/bindings/python/proton.py proton-c/src/engine/engine.c proton-c/src/engine/event.c tests/python/proton_tests/engine.py

Author: rhs
Date: Thu Jul 17 19:51:34 2014
New Revision: 1611450

URL: http://svn.apache.org/r1611450
Log:
make the connection's collector reference a weakref in python, and make collectors 'weak' in C

Modified:
    qpid/proton/trunk/proton-c/bindings/python/proton.py
    qpid/proton/trunk/proton-c/src/engine/engine.c
    qpid/proton/trunk/proton-c/src/engine/event.c
    qpid/proton/trunk/tests/python/proton_tests/engine.py

Modified: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1611450&r1=1611449&r2=1611450&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Thu Jul 17 19:51:34 2014
@@ -2300,6 +2300,7 @@ class Connection(Endpoint):
 
   def _releasing(self, child):
     coll = getattr(self, "_collector", None)
+    if coll: coll = coll()
     if coll:
       coll._contexts.add(child)
     else:
@@ -2323,9 +2324,7 @@ class Connection(Endpoint):
       pn_connection_collect(self._conn, None)
     else:
       pn_connection_collect(self._conn, collector._impl)
-    # XXX: we can't let coll go out of scope or the connection will be
-    # pointing to garbage
-    self._collector = collector
+    self._collector = weakref.ref(collector)
 
   def _get_container(self):
     return pn_connection_get_container(self._conn)

Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1611450&r1=1611449&r2=1611450&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Thu Jul 17 19:51:34 2014
@@ -361,6 +361,7 @@ static void pn_connection_finalize(void 
     return;
   }
 
+  pn_decref2(conn->collector, conn);
   pn_free(conn->sessions);
   pn_free(conn->container);
   pn_free(conn->hostname);
@@ -411,7 +412,9 @@ static const pn_event_type_t endpoint_in
 
 void pn_connection_collect(pn_connection_t *connection, pn_collector_t *collector)
 {
+  pn_decref2(connection->collector, connection);
   connection->collector = collector;
+  pn_incref2(connection->collector, connection);
   pn_endpoint_t *endpoint = connection->endpoint_head;
   while (endpoint) {
     pn_collector_put(connection->collector, endpoint_init_event_map[endpoint->type], endpoint);

Modified: qpid/proton/trunk/proton-c/src/engine/event.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/event.c?rev=1611450&r1=1611449&r2=1611450&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/event.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/event.c Thu Jul 17 19:51:34 2014
@@ -6,6 +6,7 @@ struct pn_collector_t {
   pn_event_t *head;
   pn_event_t *tail;
   pn_event_t *free_head;
+  bool freed;
 };
 
 struct pn_event_t {
@@ -20,25 +21,36 @@ static void pn_collector_initialize(void
   collector->head = NULL;
   collector->tail = NULL;
   collector->free_head = NULL;
+  collector->freed = false;
 }
 
-static void pn_collector_finalize(void *obj)
+static void pn_collector_drain(pn_collector_t *collector)
 {
-  pn_collector_t *collector = (pn_collector_t *) obj;
-
   while (pn_collector_peek(collector)) {
     pn_collector_pop(collector);
   }
 
   assert(!collector->head);
   assert(!collector->tail);
+}
 
+static void pn_collector_shrink(pn_collector_t *collector)
+{
   pn_event_t *event = collector->free_head;
   while (event) {
     pn_event_t *next = event->next;
     pn_free(event);
     event = next;
   }
+
+  collector->free_head = NULL;
+}
+
+static void pn_collector_finalize(void *obj)
+{
+  pn_collector_t *collector = (pn_collector_t *) obj;
+  pn_collector_drain(collector);
+  pn_collector_shrink(collector);
 }
 
 static int pn_collector_inspect(void *obj, pn_string_t *dst)
@@ -75,7 +87,10 @@ pn_collector_t *pn_collector(void)
 
 void pn_collector_free(pn_collector_t *collector)
 {
-  pn_free(collector);
+  collector->freed = true;
+  pn_collector_drain(collector);
+  pn_collector_shrink(collector);
+  pn_decref(collector);
 }
 
 pn_event_t *pn_event(void);
@@ -89,6 +104,10 @@ pn_event_t *pn_collector_put(pn_collecto
 
   assert(context);
 
+  if (collector->freed) {
+    return NULL;
+  }
+
   pn_event_t *event;
 
   if (collector->free_head) {

Modified: qpid/proton/trunk/tests/python/proton_tests/engine.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/engine.py?rev=1611450&r1=1611449&r2=1611450&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/engine.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/engine.py Thu Jul 17 19:51:34 2014
@@ -2076,7 +2076,6 @@ class EventTest(Test):
 
   def teardown(self):
     self.cleanup()
-    self.drain()
 
   def drain(self):
     result = []



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org