This is an automated email from the ASF dual-hosted git repository. gsim pushed a commit to branch dev-protocol-adaptors-2 in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/dev-protocol-adaptors-2 by this push: new d113e80 DISPATCH-1857: locking around activation d113e80 is described below commit d113e80369a7b8418cd22eaef539404144d8c09c Author: Gordon Sim <g...@redhat.com> AuthorDate: Wed Dec 9 09:32:56 2020 +0000 DISPATCH-1857: locking around activation --- src/adaptors/tcp_adaptor.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/adaptors/tcp_adaptor.c b/src/adaptors/tcp_adaptor.c index dd837d6..2d7974d 100644 --- a/src/adaptors/tcp_adaptor.c +++ b/src/adaptors/tcp_adaptor.c @@ -47,6 +47,7 @@ struct qdr_tcp_connection_t { qdr_link_t *outgoing; uint64_t outgoing_id; pn_raw_connection_t *pn_raw_conn; + sys_mutex_t *activation_lock; qdr_delivery_t *instream; qdr_delivery_t *outstream; bool ingress; @@ -229,7 +230,7 @@ static void free_qdr_tcp_connection(qdr_tcp_connection_t* tc) if (tc->outgoing_stream_data) { free_qd_message_stream_data_t(tc->outgoing_stream_data); } - + sys_mutex_free(tc->activation_lock); //proactor will free the socket free(tc); } @@ -530,6 +531,9 @@ static void handle_connection_event(pn_event_t *e, qd_server_t *qd_server, void } case PN_RAW_CONNECTION_DISCONNECTED: { qd_log(log, QD_LOG_INFO, "[C%"PRIu64"] PN_RAW_CONNECTION_DISCONNECTED", conn->conn_id); + sys_mutex_lock(conn->activation_lock); + conn->pn_raw_conn = 0; + sys_mutex_unlock(conn->activation_lock); handle_disconnected(conn); break; } @@ -586,6 +590,7 @@ static qdr_tcp_connection_t *qdr_tcp_connection_ingress(qd_tcp_listener_t* liste { qdr_tcp_connection_t* tc = NEW(qdr_tcp_connection_t); ZERO(tc); + tc->activation_lock = sys_mutex(); tc->ingress = true; tc->context.context = tc; tc->context.handler = &handle_connection_event; @@ -663,6 +668,7 @@ static qdr_tcp_connection_t *qdr_tcp_connection_egress(qd_bridge_config_t *confi { qdr_tcp_connection_t* tc = NEW(qdr_tcp_connection_t); ZERO(tc); + tc->activation_lock = sys_mutex(); if (initial_delivery) { tc->egress_dispatcher = false; tc->initial_delivery = initial_delivery; @@ -1043,7 +1049,7 @@ static uint64_t qdr_tcp_deliver(void *context, qdr_link_t *link, qdr_delivery_t void* link_context = qdr_link_get_context(link); if (link_context) { qdr_tcp_connection_t* tc = (qdr_tcp_connection_t*) link_context; - qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"][L%"PRIu64"] qdr_tcp_deliver Delivery event", tc->conn_id, tc->outgoing_id); + qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"][L%"PRIu64"] qdr_tcp_deliver Delivery event dlv:%lx", tc->conn_id, tc->outgoing_id, delivery); if (tc->egress_dispatcher) { qdr_tcp_connection_egress(&(tc->config), tc->server, delivery); return QD_DELIVERY_MOVED_TO_NEW_LINK; @@ -1156,10 +1162,13 @@ static void qdr_tcp_activate(void *notused, qdr_connection_t *c) void *context = qdr_connection_get_context(c); if (context) { qdr_tcp_connection_t* conn = (qdr_tcp_connection_t*) context; + sys_mutex_lock(conn->activation_lock); if (conn->pn_raw_conn) { qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"] qdr_tcp_activate: waking raw connection", conn->conn_id); pn_raw_connection_wake(conn->pn_raw_conn); + sys_mutex_unlock(conn->activation_lock); } else if (conn->activate_timer) { + sys_mutex_unlock(conn->activation_lock); // On egress, the raw connection is only created once the // first part of the message encapsulating the // client->server half of the stream has been @@ -1169,7 +1178,8 @@ static void qdr_tcp_activate(void *notused, qdr_connection_t *c) qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"] qdr_tcp_activate: schedule activate_timer", conn->conn_id); qd_timer_schedule(conn->activate_timer, 0); } else { - qd_log(tcp_adaptor->log_source, QD_LOG_ERROR, "[C%"PRIu64"] qdr_tcp_activate: Cannot activate", conn->conn_id); + sys_mutex_unlock(conn->activation_lock); + qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"] qdr_tcp_activate: Cannot activate", conn->conn_id); } } else { qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "qdr_tcp_activate: no connection context"); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org