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]
