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