This is an automated email from the ASF dual-hosted git repository.

gmurthy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/main by this push:
     new 23558e0  DISPATCH-2032: Zero out the link_work references on delivery 
during link cleanup. This closes #1122.
23558e0 is described below

commit 23558e059081ce0a28aa933e45b464b928c52d76
Author: Ganesh Murthy <gmur...@apache.org>
AuthorDate: Wed Apr 14 14:24:52 2021 -0400

    DISPATCH-2032: Zero out the link_work references on delivery during link 
cleanup. This closes #1122.
---
 src/router_core/connections.c         | 5 ++++-
 src/router_core/router_core.c         | 4 ++++
 src/router_core/router_core_private.h | 1 +
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 27ceb81..a7b7b4f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -746,7 +746,7 @@ static void qdr_generate_link_name(const char *label, char 
*buffer, size_t lengt
 }
 
 
-static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t 
*conn, qdr_link_t *link)
+void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *conn, 
qdr_link_t *link)
 {
     //
     // Clean up the lists of deliveries on this link
@@ -766,6 +766,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t 
*core, qdr_connection_t *c
         if (d->presettled)
             core->dropped_presettled_deliveries++;
         d->where = QDR_DELIVERY_NOWHERE;
+        d->link_work = 0;
         d = DEQ_NEXT(d);
     }
 
@@ -774,6 +775,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t 
*core, qdr_connection_t *c
     while (d) {
         assert(d->where == QDR_DELIVERY_IN_UNSETTLED);
         d->where = QDR_DELIVERY_NOWHERE;
+        d->link_work = 0;
         d = DEQ_NEXT(d);
     }
 
@@ -782,6 +784,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t 
*core, qdr_connection_t *c
     while (d) {
         assert(d->where == QDR_DELIVERY_IN_SETTLED);
         d->where = QDR_DELIVERY_NOWHERE;
+        d->link_work = 0;
         d = DEQ_NEXT(d);
     }
     sys_mutex_unlock(conn->work_lock);
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index 83e687b..962ecef 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -224,8 +224,12 @@ void qdr_core_free(qdr_core_t *core)
             DEQ_REMOVE_N(STREAMING_POOL, link->conn->streaming_link_pool, 
link);
             link->in_streaming_pool = false;
         }
+
+        qdr_link_cleanup_deliveries_CT(core, link->conn, link);
+
         if (link->core_endpoint)
             qdrc_endpoint_do_cleanup_CT(core, link->core_endpoint);
+
         qdr_del_link_ref(&link->conn->links, link, 
QDR_LINK_LIST_CLASS_CONNECTION);
         qdr_del_link_ref(&link->conn->links_with_work[link->priority], link, 
QDR_LINK_LIST_CLASS_WORK);
         free(link->name);
diff --git a/src/router_core/router_core_private.h 
b/src/router_core/router_core_private.h
index 28f5140..0464b4f 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -987,6 +987,7 @@ qdr_edge_t *qdr_edge(qdr_core_t *);
 void qdr_edge_free(qdr_edge_t *);
 void qdr_edge_connection_opened(qdr_edge_t *edge, qdr_connection_t *conn);
 void qdr_edge_connection_closed(qdr_edge_t *edge);
+void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *conn, 
qdr_link_t *link);
 
 void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
                                     qdr_connection_t      *conn,

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

Reply via email to