You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2017/02/03 17:17:17 UTC
qpid-dispatch git commit: DISPATCH-628: Multiple connections per
autoLink and linkRoute overwrites connection handle
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 0a60abbf6 -> 7d6c05376
DISPATCH-628: Multiple connections per autoLink and linkRoute overwrites connection handle
This ensures that an autolink and linkroute can be bound to more than one
connection. The assert checking this is disabled in optimized builds and was
never triggered.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/7d6c0537
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/7d6c0537
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/7d6c0537
Branch: refs/heads/master
Commit: 7d6c053764d454449e997425ac695a2189ef6908
Parents: 0a60abb
Author: Ulf Lilleengen <lu...@redhat.com>
Authored: Fri Feb 3 10:58:19 2017 +0100
Committer: Ulf Lilleengen <lu...@redhat.com>
Committed: Fri Feb 3 18:11:20 2017 +0100
----------------------------------------------------------------------
src/router_core/route_control.c | 40 +++++++++++++++++++++---------
src/router_core/router_core_private.h | 8 +++---
2 files changed, 32 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7d6c0537/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index b109e03..022aebb 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -53,7 +53,7 @@ static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identi
// If this connection identifier has no open connection and no referencing routes,
// it can safely be deleted and removed from the hash index.
//
- if (cid->open_connection == 0 && DEQ_IS_EMPTY(cid->link_route_refs) && DEQ_IS_EMPTY(cid->auto_link_refs)) {
+ if (DEQ_IS_EMPTY(cid->connection_refs) && DEQ_IS_EMPTY(cid->link_route_refs) && DEQ_IS_EMPTY(cid->auto_link_refs)) {
qd_hash_remove_by_handle(core->conn_id_hash, cid->hash_handle);
free_qdr_conn_identifier_t(cid);
}
@@ -204,8 +204,11 @@ qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t *core,
if (conn_id) {
lr->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
DEQ_INSERT_TAIL_N(REF, lr->conn_id->link_route_refs, lr);
- if (lr->conn_id->open_connection)
- qdr_link_route_activate_CT(core, lr, lr->conn_id->open_connection);
+ qdr_connection_ref_t * cref = DEQ_HEAD(lr->conn_id->connection_refs);
+ while (cref) {
+ qdr_link_route_activate_CT(core, lr, cref->conn);
+ cref = DEQ_NEXT(cref);
+ }
}
//
@@ -225,8 +228,11 @@ void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr)
//
qdr_conn_identifier_t *cid = lr->conn_id;
if (cid) {
- if (!!cid->open_connection)
- qdr_link_route_deactivate_CT(core, lr, cid->open_connection);
+ qdr_connection_ref_t * cref = DEQ_HEAD(cid->connection_refs);
+ while (cref) {
+ qdr_link_route_deactivate_CT(core, lr, cref->conn);
+ cref = DEQ_NEXT(cref);
+ }
DEQ_REMOVE_N(REF, cid->link_route_refs, lr);
qdr_route_check_id_for_deletion_CT(core, cid);
}
@@ -292,8 +298,11 @@ qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t *core,
if (conn_id) {
al->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
DEQ_INSERT_TAIL_N(REF, al->conn_id->auto_link_refs, al);
- if (al->conn_id->open_connection)
- qdr_auto_link_activate_CT(core, al, al->conn_id->open_connection);
+ qdr_connection_ref_t * cref = DEQ_HEAD(al->conn_id->connection_refs);
+ while (cref) {
+ qdr_auto_link_activate_CT(core, al, cref->conn);
+ cref = DEQ_NEXT(cref);
+ }
}
//
@@ -313,8 +322,11 @@ void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *al)
//
qdr_conn_identifier_t *cid = al->conn_id;
if (cid) {
- if (!!cid->open_connection)
- qdr_auto_link_deactivate_CT(core, al, cid->open_connection);
+ qdr_connection_ref_t * cref = DEQ_HEAD(cid->connection_refs);
+ while (cref) {
+ qdr_auto_link_deactivate_CT(core, al, cref->conn);
+ cref = DEQ_NEXT(cref);
+ }
DEQ_REMOVE_N(REF, cid->auto_link_refs, al);
qdr_route_check_id_for_deletion_CT(core, cid);
}
@@ -347,8 +359,8 @@ void qdr_route_connection_opened_CT(qdr_core_t *core,
qdr_conn_identifier_t *cid = qdr_route_declare_id_CT(core, field->iterator, is_container);
- assert(!cid->open_connection);
- cid->open_connection = conn;
+ qdr_add_connection_ref(&cid->connection_refs, conn);
+
conn->conn_id = cid;
//
@@ -396,7 +408,11 @@ void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
al = DEQ_NEXT_N(REF, al);
}
- cid->open_connection = 0;
+ //
+ // Remove our own entry in the connection list
+ //
+ qdr_del_connection_ref(&cid->connection_refs, conn);
+
conn->conn_id = 0;
qdr_route_check_id_for_deletion_CT(core, cid);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7d6c0537/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index d3b22d1..0185da0 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -535,10 +535,10 @@ DEQ_DECLARE(qdr_auto_link_t, qdr_auto_link_list_t);
struct qdr_conn_identifier_t {
- qd_hash_handle_t *hash_handle;
- qdr_connection_t *open_connection;
- qdr_link_route_list_t link_route_refs;
- qdr_auto_link_list_t auto_link_refs;
+ qd_hash_handle_t *hash_handle;
+ qdr_connection_ref_list_t connection_refs;
+ qdr_link_route_list_t link_route_refs;
+ qdr_auto_link_list_t auto_link_refs;
};
ALLOC_DECLARE(qdr_conn_identifier_t);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org