This is an automated email from the ASF dual-hosted git repository. tross pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
commit ac2c1472c0995a6e96ac031eb70bed5aa7531ff0 Author: Ted Ross <tr...@apache.org> AuthorDate: Fri Jan 15 13:29:21 2021 -0500 DISPATCH-1912 - Fixed bugs identified by the thread sanitizer. --- include/qpid/dispatch/buffer.h | 4 ++++ src/adaptors/tcp_adaptor.c | 2 -- src/buffer.c | 3 --- src/router_core/connections.c | 6 ++++++ src/router_core/delivery.c | 11 +++++++---- src/router_core/delivery.h | 2 +- src/router_core/forwarder.c | 2 +- 7 files changed, 19 insertions(+), 11 deletions(-) diff --git a/include/qpid/dispatch/buffer.h b/include/qpid/dispatch/buffer.h index 230eebc..e23f690 100644 --- a/include/qpid/dispatch/buffer.h +++ b/include/qpid/dispatch/buffer.h @@ -44,6 +44,10 @@ struct qd_buffer_t { /** * Set the initial buffer capacity to be allocated by future calls to qp_buffer. + * + * NOTICE: This function is provided for testing purposes only. It should not be invoked + * in the production code. If this function is called after the first buffer has been allocated, + * the software WILL BE unstable and WILL crash. */ void qd_buffer_set_size(size_t size); diff --git a/src/adaptors/tcp_adaptor.c b/src/adaptors/tcp_adaptor.c index 994f1b4..7ff4e50 100644 --- a/src/adaptors/tcp_adaptor.c +++ b/src/adaptors/tcp_adaptor.c @@ -673,8 +673,6 @@ static void qdr_tcp_open_server_side_connection(qdr_tcp_connection_t* tc) if (!!tc->initial_delivery) { qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, DLV_FMT" initial_delivery ownership passed to "DLV_FMT, DLV_ARGS(tc->initial_delivery), tc->outgoing->conn_id, tc->outgoing->identity, tc->initial_delivery->delivery_id); - tc->initial_delivery->conn_id = tc->outgoing->conn_id; - tc->initial_delivery->link_id = tc->outgoing->identity; qdr_delivery_decref(tcp_adaptor->core, tc->initial_delivery, "tcp-adaptor - passing initial_delivery into new link"); tc->initial_delivery = 0; } diff --git a/src/buffer.c b/src/buffer.c index 94315b2..d3e788e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -25,7 +25,6 @@ size_t BUFFER_SIZE = 512; -static int size_locked = 0; ALLOC_DECLARE(qd_buffer_t); ALLOC_DEFINE_CONFIG(qd_buffer_t, sizeof(qd_buffer_t), &BUFFER_SIZE, 0); @@ -33,14 +32,12 @@ ALLOC_DEFINE_CONFIG(qd_buffer_t, sizeof(qd_buffer_t), &BUFFER_SIZE, 0); void qd_buffer_set_size(size_t size) { - assert(!size_locked); BUFFER_SIZE = size; } qd_buffer_t *qd_buffer(void) { - size_locked = 1; qd_buffer_t *buf = new_qd_buffer_t(); DEQ_ITEM_INIT(buf); diff --git a/src/router_core/connections.c b/src/router_core/connections.c index 2d833e1..6bba0d5 100644 --- a/src/router_core/connections.c +++ b/src/router_core/connections.c @@ -1646,6 +1646,12 @@ static void qdr_link_process_initial_delivery_CT(qdr_core_t *core, qdr_link_t *l qdr_forward_deliver_CT(core, link, dlv); // + // Adjust the delivery's identity + // + dlv->conn_id = link->conn->identity; + dlv->link_id = link->identity; + + // // Adjust the delivery's reference count // assert(ref_delta <= 0); diff --git a/src/router_core/delivery.c b/src/router_core/delivery.c index 37632b2..01bba64 100644 --- a/src/router_core/delivery.c +++ b/src/router_core/delivery.c @@ -108,8 +108,6 @@ uint64_t qdr_delivery_disposition(const qdr_delivery_t *delivery) void qdr_delivery_incref(qdr_delivery_t *delivery, const char *label) { uint32_t rc = sys_atomic_inc(&delivery->ref_count); - assert(rc > 0 || !delivery->ref_counted); - delivery->ref_counted = true; qdr_link_t *link = qdr_delivery_link(delivery); if (link) qd_log(link->core->log, QD_LOG_DEBUG, DLV_FMT" Delivery incref: rc:%"PRIu32" %s", @@ -138,11 +136,16 @@ void qdr_delivery_set_presettled(qdr_delivery_t *delivery) void qdr_delivery_decref(qdr_core_t *core, qdr_delivery_t *delivery, const char *label) { + char log_prefix[DLV_ARGS_MAX]; + if (qd_log_enabled(core->log, QD_LOG_DEBUG)) { + snprintf(log_prefix, DLV_ARGS_MAX, DLV_FMT, DLV_ARGS(delivery)); + } + uint32_t ref_count = sys_atomic_dec(&delivery->ref_count); assert(ref_count > 0); - qd_log(core->log, QD_LOG_DEBUG, DLV_FMT" Delivery decref: rc:%"PRIu32" %s", - DLV_ARGS(delivery), ref_count - 1, label); + qd_log(core->log, QD_LOG_DEBUG, "%s Delivery decref: rc:%"PRIu32" %s", + log_prefix, ref_count - 1, label); if (ref_count == 1) { // The ref_count was 1 and now it is zero. We are deleting the last ref. diff --git a/src/router_core/delivery.h b/src/router_core/delivery.h index bbcccc2..7f9ae7d 100644 --- a/src/router_core/delivery.h +++ b/src/router_core/delivery.h @@ -36,7 +36,6 @@ struct qdr_delivery_t { DEQ_LINKS(qdr_delivery_t); void *context; sys_atomic_t ref_count; - bool ref_counted; /// Used to protect against ref count going 1 -> 0 -> 1 qdr_link_t_sp link_sp; /// Safe pointer to the link qdr_delivery_t *peer; /// Use this peer if the delivery has one and only one peer. qdr_delivery_ref_t *next_peer_ref; @@ -80,6 +79,7 @@ static inline uint32_t next_delivery_id() { return sys_atomic_inc(&global_delive // Common log line prefix #define DLV_FMT "[C%"PRIu64"][L%"PRIu64"][D%"PRIu32"]" #define DLV_ARGS(dlv) dlv->conn_id, dlv->link_id, dlv->delivery_id +#define DLV_ARGS_MAX 75 /////////////////////////////////////////////////////////////////////////////// // Delivery API diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c index 43b2943..be704ea 100644 --- a/src/router_core/forwarder.c +++ b/src/router_core/forwarder.c @@ -348,7 +348,7 @@ void qdr_forward_on_message(qdr_core_t *core, qdr_general_work_t *work) qdr_action_enqueue(core, action); // Transfer the delivery reference from work protection to action protection } else - qdr_delivery_decref_CT(core, work->delivery, "qdr_forward_on_message - remove from general work"); + qdr_delivery_decref(core, work->delivery, "qdr_forward_on_message - remove from general work"); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org