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 2b95158 DISPATCH-1417 - Introduced a lock around the core thread connection activation to prevent premature freeing of qd_connection_t object. This closes #565. 2b95158 is described below commit 2b95158826f32ca9f43e15c891602ec0acc63c18 Author: Ganesh Murthy <gmur...@apache.org> AuthorDate: Wed Sep 11 23:02:44 2019 -0400 DISPATCH-1417 - Introduced a lock around the core thread connection activation to prevent premature freeing of qd_connection_t object. This closes #565. --- src/dispatch_private.h | 2 ++ src/router_core/router_core_thread.c | 3 +++ src/server.c | 10 ++++++++++ 3 files changed, 15 insertions(+) diff --git a/src/dispatch_private.h b/src/dispatch_private.h index a01db9b..f658fb2 100644 --- a/src/dispatch_private.h +++ b/src/dispatch_private.h @@ -126,4 +126,6 @@ void qd_dispatch_set_agent(qd_dispatch_t *qd, void *agent); qdr_core_t* qd_dispatch_router_core(qd_dispatch_t *qd); +sys_mutex_t *qd_server_get_activation_lock(qd_server_t *server); + #endif diff --git a/src/router_core/router_core_thread.c b/src/router_core/router_core_thread.c index c82d3f2..8a4682c 100644 --- a/src/router_core/router_core_thread.c +++ b/src/router_core/router_core_thread.c @@ -19,6 +19,7 @@ #include "router_core_private.h" #include "module.h" +#include "dispatch_private.h" /** * Creates a thread that is dedicated to managing and using the routing table. @@ -62,7 +63,9 @@ static void qdr_activate_connections_CT(qdr_core_t *core) while (conn) { DEQ_REMOVE_HEAD_N(ACTIVATE, core->connections_to_activate); conn->in_activate_list = false; + sys_mutex_lock(qd_server_get_activation_lock(core->qd->server)); qd_server_activate((qd_connection_t*) qdr_connection_get_context(conn)); + sys_mutex_unlock(qd_server_get_activation_lock(core->qd->server)); conn = DEQ_HEAD(core->connections_to_activate); } } diff --git a/src/server.c b/src/server.c index e8bfd9a..a6c2548 100644 --- a/src/server.c +++ b/src/server.c @@ -68,6 +68,7 @@ struct qd_server_t { uint64_t next_connection_id; void *py_displayname_obj; qd_http_server_t *http; + sys_mutex_t *conn_activation_lock; }; #define HEARTBEAT_INTERVAL 1000 @@ -843,7 +844,9 @@ static void qd_connection_free(qd_connection_t *ctx) if (ctx->timer) qd_timer_free(ctx->timer); free(ctx->name); free(ctx->role); + sys_mutex_lock(qd_server->conn_activation_lock); free_qd_connection_t(ctx); + sys_mutex_unlock(qd_server->conn_activation_lock); /* Note: pn_conn is freed by the proactor */ } @@ -1216,6 +1219,7 @@ qd_server_t *qd_server(qd_dispatch_t *qd, int thread_count, const char *containe qd_server->container = 0; qd_server->start_context = 0; qd_server->lock = sys_mutex(); + qd_server->conn_activation_lock = sys_mutex(); qd_server->cond = sys_cond(); DEQ_INIT(qd_server->conn_list); @@ -1252,6 +1256,7 @@ void qd_server_free(qd_server_t *qd_server) } qd_timer_finalize(); sys_mutex_free(qd_server->lock); + sys_mutex_free(qd_server->conn_activation_lock); sys_cond_free(qd_server->cond); Py_XDECREF((PyObject *)qd_server->py_displayname_obj); free(qd_server); @@ -1547,3 +1552,8 @@ void qd_connection_handle(qd_connection_t *c, pn_event_t *e) { bool qd_connection_strip_annotations_in(const qd_connection_t *c) { return c->strip_annotations_in; } + +sys_mutex_t *qd_server_get_activation_lock(qd_server_t * server) +{ + return server->conn_activation_lock; +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org