Repository: qpid-dispatch
Updated Branches:
  refs/heads/0.7.x 444224e90 -> 8ba6302ff


DISPATCH-535 - Removed pn_incref and pn_decref and used pn_session_free and 
pn_link_free. Also fixed qdr_field leak (from Ganesh Murthy).
This closes #107


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/00c45680
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/00c45680
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/00c45680

Branch: refs/heads/0.7.x
Commit: 00c45680fecfbe327dc7c9ced10573e50fc581c8
Parents: 444224e
Author: Ted Ross <[email protected]>
Authored: Wed Nov 2 13:24:02 2016 -0400
Committer: Ted Ross <[email protected]>
Committed: Thu Nov 3 10:55:43 2016 -0400

----------------------------------------------------------------------
 src/container.c               | 54 +++++++++++++++++++-------------------
 src/router_core/connections.c |  4 +++
 2 files changed, 31 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/00c45680/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index 5080258..dc3c17b 100644
--- a/src/container.c
+++ b/src/container.c
@@ -129,12 +129,6 @@ static void setup_outgoing_link(qd_container_t *container, 
pn_link_t *pn_link)
     link->drain_mode             = pn_link_get_drain(pn_link);
     link->close_sess_with_link   = false;
 
-    //
-    // Keep the borrowed references
-    //
-    pn_incref(pn_link);
-    pn_incref(link->pn_sess);
-
     pn_link_set_context(pn_link, link);
     node->ntype->outgoing_handler(node->context, link);
 }
@@ -184,12 +178,6 @@ static void setup_incoming_link(qd_container_t *container, 
pn_link_t *pn_link)
     link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(pn_link);
     link->close_sess_with_link = false;
 
-    //
-    // Keep the borrowed references
-    //
-    pn_incref(pn_link);
-    pn_incref(link->pn_sess);
-
     pn_link_set_context(pn_link, link);
     node->ntype->incoming_handler(node->context, link);
 }
@@ -398,7 +386,12 @@ int pn_event_handler(void *handler_context, void 
*conn_context, pn_event_t *even
             }
         }
         break;
-
+    case PN_SESSION_LOCAL_CLOSE :
+        ssn = pn_event_session(event);
+        if (pn_session_state(ssn) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+            pn_session_free(ssn);
+        }
+        break;
     case PN_SESSION_REMOTE_CLOSE :
         if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
             ssn = pn_event_session(event);
@@ -435,6 +428,9 @@ int pn_event_handler(void *handler_context, void 
*conn_context, pn_event_t *even
                 }
                 pn_session_close(ssn);
             }
+            else if (pn_session_state(ssn) == (PN_LOCAL_CLOSED | 
PN_REMOTE_CLOSED)) {
+                pn_session_free(ssn);
+            }
         }
         break;
 
@@ -470,6 +466,7 @@ int pn_event_handler(void *handler_context, void 
*conn_context, pn_event_t *even
             pn_link = pn_event_link(event);
             qd_link = (qd_link_t*) pn_link_get_context(pn_link);
             if (qd_link) {
+                pn_session_t *sess = qd_link->pn_sess;
                 qd_node_t *node = qd_link->node;
                 qd_detach_type_t dt = pn_event_type(event) == 
PN_LINK_REMOTE_CLOSE ? QD_CLOSED : QD_DETACHED;
                 if (node)
@@ -492,13 +489,26 @@ int pn_event_handler(void *handler_context, void 
*conn_context, pn_event_t *even
                         assert (qd_conn->n_senders >= 0);
                     }
                 }
-                if (qd_link->close_sess_with_link && qd_link->pn_sess &&
-                    pn_link_state(pn_link) == (PN_LOCAL_CLOSED | 
PN_REMOTE_CLOSED))
-                    pn_session_close(qd_link->pn_sess);
+
+                if (pn_link_state(pn_link) == (PN_LOCAL_CLOSED | 
PN_REMOTE_CLOSED)) {
+                    if (qd_link->close_sess_with_link && sess) {
+                        pn_session_close(sess);
+                    }
+                    pn_link_free(pn_link);
+                }
             }
         }
         break;
 
+    case PN_LINK_LOCAL_DETACH:
+    case PN_LINK_LOCAL_CLOSE:
+        pn_link = pn_event_link(event);
+        if (pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+            pn_link_free(pn_link);
+        }
+        break;
+
+
     case PN_LINK_FLOW :
         pn_link = pn_event_link(event);
         qd_link = (qd_link_t*) pn_link_get_context(pn_link);
@@ -530,12 +540,9 @@ int pn_event_handler(void *handler_context, void 
*conn_context, pn_event_t *even
     case PN_CONNECTION_FINAL :
     case PN_SESSION_INIT :
     case PN_SESSION_LOCAL_OPEN :
-    case PN_SESSION_LOCAL_CLOSE :
     case PN_SESSION_FINAL :
     case PN_LINK_INIT :
     case PN_LINK_LOCAL_OPEN :
-    case PN_LINK_LOCAL_CLOSE :
-    case PN_LINK_LOCAL_DETACH :
     case PN_LINK_FINAL :
     case PN_TRANSPORT :
     case PN_TRANSPORT_ERROR :
@@ -779,12 +786,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, 
qd_direction_t dir, c
     link->remote_snd_settle_mode = 
pn_link_remote_snd_settle_mode(link->pn_link);
     link->close_sess_with_link = true;
 
-    //
-    // Keep the borrowed references
-    //
-    pn_incref(link->pn_link);
-    pn_incref(link->pn_sess);
-
     pn_link_set_context(link->pn_link, link);
 
     pn_session_open(link->pn_sess);
@@ -796,8 +797,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, 
qd_direction_t dir, c
 void qd_link_free(qd_link_t *link)
 {
     if (!link) return;
-    if (link->pn_link) pn_decref(link->pn_link);
-    if (link->pn_sess) pn_decref(link->pn_sess);
     link->pn_link = 0;
     link->pn_sess = 0;
     free_qd_link_t(link);
@@ -942,6 +941,7 @@ void qd_link_close(qd_link_t *link)
     if (link->pn_link)
         pn_link_close(link->pn_link);
 
+
     if (link->close_sess_with_link && link->pn_sess &&
         pn_link_state(link->pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
         pn_session_close(link->pn_sess);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/00c45680/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 1cd054b..a114e1f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -884,6 +884,8 @@ static void qdr_connection_opened_CT(qdr_core_t *core, 
qdr_action_t *action, boo
             //
             // No action needed for NORMAL connections
             //
+            qdr_field_free(action->args.connection.connection_label);
+            qdr_field_free(action->args.connection.container_id);
             return;
         }
 
@@ -897,6 +899,8 @@ static void qdr_connection_opened_CT(qdr_core_t *core, 
qdr_action_t *action, boo
             else {
                 qd_log(core->log, QD_LOG_CRITICAL, "Exceeded maximum 
inter-router connection count");
                 conn->role = QDR_ROLE_NORMAL;
+                qdr_field_free(action->args.connection.connection_label);
+                qdr_field_free(action->args.connection.container_id);
                 return;
             }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to