From 2def0a9b444288cc1c87f80b6b80e64bd59f478c Mon Sep 17 00:00:00 2001 From: Chuck Rolke Date: Sat, 8 Jul 2017 10:25:24 -0400 Subject: [PATCH] DISPATCH-759: Move freeing message and iterator out of core thread Some of delivery deletion requires core context and that part stays. --- src/router_core/transfer.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c index 5ae67c8856..66b968717c 100644 --- a/src/router_core/transfer.c +++ b/src/router_core/transfer.c @@ -374,15 +374,25 @@ bool qdr_delivery_settled_CT(qdr_core_t *core, qdr_delivery_t *dlv) } +static void qdr_do_message_to_addr_free(qdr_core_t *core, qdr_general_work_t *work) +{ + if (work->msg) + qd_message_free(work->msg); + if (work->on_message_context) + qd_iterator_free((qd_iterator_t *)work->on_message_context); +} + + static void qdr_delete_delivery_internal_CT(qdr_core_t *core, qdr_delivery_t *delivery) { qdr_link_t *link = delivery->link; - if (delivery->msg) - qd_message_free(delivery->msg); - - if (delivery->to_addr) - qd_iterator_free(delivery->to_addr); + if (delivery->msg || delivery->to_addr) { + qdr_general_work_t *work = qdr_general_work(qdr_do_message_to_addr_free); + work->msg = delivery->msg; + work->on_message_context = delivery->to_addr; + qdr_post_general_work_CT(core, work); + } if (delivery->tracking_addr) { delivery->tracking_addr->outstanding_deliveries[delivery->tracking_addr_bit]--;