You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gm...@apache.org on 2019/09/30 14:59:03 UTC
[qpid-dispatch] branch master updated: DISPATCH-1426 - Added an
abandoned deliveries handler so all abandoned deliveries are handled in a
single place, right before the qd_link is freed. This closes #573.
This is an automated email from the ASF dual-hosted git repository.
gmurthy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/master by this push:
new 17f20fb DISPATCH-1426 - Added an abandoned deliveries handler so all abandoned deliveries are handled in a single place, right before the qd_link is freed. This closes #573.
17f20fb is described below
commit 17f20fb58b32d07bb1f95067c7210819e24b4b5d
Author: Ganesh Murthy <gm...@apache.org>
AuthorDate: Tue Sep 24 14:29:48 2019 -0400
DISPATCH-1426 - Added an abandoned deliveries handler so all abandoned deliveries are handled in a single place, right before the qd_link is freed. This closes #573.
---
include/qpid/dispatch/container.h | 15 +++++++++------
src/container.c | 13 ++-----------
src/router_node.c | 11 ++++-------
3 files changed, 15 insertions(+), 24 deletions(-)
diff --git a/include/qpid/dispatch/container.h b/include/qpid/dispatch/container.h
index bfe1da4..04940e2 100644
--- a/include/qpid/dispatch/container.h
+++ b/include/qpid/dispatch/container.h
@@ -73,12 +73,13 @@ typedef struct qd_link_t qd_link_t;
ALLOC_DECLARE(qd_link_t);
-typedef bool (*qd_container_delivery_handler_t) (void *node_context, qd_link_t *link);
-typedef void (*qd_container_disposition_handler_t) (void *node_context, qd_link_t *link, pn_delivery_t *pnd);
-typedef int (*qd_container_link_handler_t) (void *node_context, qd_link_t *link);
-typedef int (*qd_container_link_detach_handler_t) (void *node_context, qd_link_t *link, qd_detach_type_t dt);
-typedef void (*qd_container_node_handler_t) (void *type_context, qd_node_t *node);
-typedef int (*qd_container_conn_handler_t) (void *type_context, qd_connection_t *conn, void *context);
+typedef bool (*qd_container_delivery_handler_t) (void *node_context, qd_link_t *link);
+typedef void (*qd_container_disposition_handler_t) (void *node_context, qd_link_t *link, pn_delivery_t *pnd);
+typedef int (*qd_container_link_handler_t) (void *node_context, qd_link_t *link);
+typedef int (*qd_container_link_detach_handler_t) (void *node_context, qd_link_t *link, qd_detach_type_t dt);
+typedef void (*qd_container_node_handler_t) (void *type_context, qd_node_t *node);
+typedef int (*qd_container_conn_handler_t) (void *type_context, qd_connection_t *conn, void *context);
+typedef void (*qd_container_link_abandoned_deliveries_handler_t) (void *node_context, qd_link_t *link);
/**
* A set of Node handlers for deliveries, links and container events.
@@ -114,6 +115,8 @@ typedef struct {
/** Invoked when a link we created was opened by the peer */
qd_container_link_handler_t link_attach_handler;
+ qd_container_link_abandoned_deliveries_handler_t link_abandoned_deliveries_handler;
+
/** Invoked when a link receives a flow event */
qd_container_link_handler_t link_flow_handler;
diff --git a/src/container.c b/src/container.c
index 0404cf8..c5a7709 100644
--- a/src/container.c
+++ b/src/container.c
@@ -900,17 +900,8 @@ void qd_link_free(qd_link_t *link)
DEQ_REMOVE(container->links, link);
sys_mutex_unlock(container->lock);
-
- qd_link_ref_list_t *list = qd_link_get_ref_list(link);
-
- if (list) {
- qd_link_ref_t *link_ref = DEQ_HEAD (*list);
- while (link_ref) {
- DEQ_REMOVE_HEAD(*list);
- free_qd_link_ref_t(link_ref);
- link_ref = DEQ_HEAD (*list);
- }
- }
+ qd_node_t *node = link->node;
+ node->ntype->link_abandoned_deliveries_handler(node->context, link);
free_qd_link_t(link);
}
diff --git a/src/router_node.c b/src/router_node.c
index ef1ce17..c302e20 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -102,8 +102,9 @@ static qdr_delivery_t *qdr_node_delivery_qdr_from_pn(pn_delivery_t *dlv)
}
-static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link)
+void qd_link_abandoned_deliveries_handler(void *context, qd_link_t *link)
{
+ qd_router_t *router = (qd_router_t*) context;
qd_link_ref_list_t *list = qd_link_get_ref_list(link);
qd_link_ref_t *ref = DEQ_HEAD(*list);
@@ -112,7 +113,7 @@ static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link
qdr_delivery_t *dlv = (qdr_delivery_t*) ref->ref;
ref->ref = 0;
qdr_delivery_set_context(dlv, 0);
- qdr_delivery_decref(core, dlv, "qdr_node_reap_abandoned_deliveries");
+ qdr_delivery_decref(router->router_core, dlv, "qd_link_abandoned_deliveries_handler");
free_qd_link_ref_t(ref);
ref = DEQ_HEAD(*list);
}
@@ -120,7 +121,6 @@ static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link
-
/**
* Determine the role of a connection
*/
@@ -826,7 +826,6 @@ static int AMQP_link_detach_handler(void* context, qd_link_t *link, qd_detach_ty
}
}
- qd_router_t *router = (qd_router_t*) context;
qdr_link_t *rlink = (qdr_link_t*) qd_link_get_context(link);
pn_condition_t *cond = qd_link_pn(link) ? pn_link_remote_condition(qd_link_pn(link)) : 0;
@@ -844,7 +843,6 @@ static int AMQP_link_detach_handler(void* context, qd_link_t *link, qd_detach_ty
//
if (dt == QD_LOST || qdr_link_get_context(rlink) == 0) {
qdr_link_set_context(rlink, 0);
- qdr_node_reap_abandoned_deliveries(router->router_core, link);
qd_link_free(link);
}
@@ -1263,6 +1261,7 @@ static qd_node_type_t router_node = {"router", 0, 0,
AMQP_writable_conn_handler,
AMQP_link_detach_handler,
AMQP_link_attach_handler,
+ qd_link_abandoned_deliveries_handler,
AMQP_link_flow_handler,
0, // node_created_handler
0, // node_destroyed_handler
@@ -1429,7 +1428,6 @@ static void CORE_close_connection(void *context, qdr_connection_t *qdr_conn, qdr
static void CORE_link_detach(void *context, qdr_link_t *link, qdr_error_t *error, bool first, bool close)
{
- qd_router_t *router = (qd_router_t*) context;
qd_link_t *qlink = (qd_link_t*) qdr_link_get_context(link);
if (!qlink)
return;
@@ -1473,7 +1471,6 @@ static void CORE_link_detach(void *context, qdr_link_t *link, qdr_error_t *error
// If this is the second detach, free the qd_link
//
if (!first) {
- qdr_node_reap_abandoned_deliveries(router->router_core, qlink);
qd_link_free(qlink);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org