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 2016/11/03 19:59:22 UTC

[1/4] qpid-dispatch git commit: DISPATCH-535 - Removed pn_incref and pn_decref and used pn_session_free and pn_link_free. Also fixed qdr_field leak (from Ganesh Murthy). This closes #107

Repository: qpid-dispatch
Updated Branches:
  refs/heads/0.7.x 444224e90 -> 8ba6302ff


DISPATCH-535 - Removed pn_incref and pn_decref and used pn_session_free and pn_link_free. Also fixed qdr_field leak (from Ganesh Murthy).
This closes #107


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/00c45680
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/00c45680
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/00c45680

Branch: refs/heads/0.7.x
Commit: 00c45680fecfbe327dc7c9ced10573e50fc581c8
Parents: 444224e
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Nov 2 13:24:02 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 3 10:55:43 2016 -0400

----------------------------------------------------------------------
 src/container.c               | 54 +++++++++++++++++++-------------------
 src/router_core/connections.c |  4 +++
 2 files changed, 31 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/00c45680/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index 5080258..dc3c17b 100644
--- a/src/container.c
+++ b/src/container.c
@@ -129,12 +129,6 @@ static void setup_outgoing_link(qd_container_t *container, pn_link_t *pn_link)
     link->drain_mode             = pn_link_get_drain(pn_link);
     link->close_sess_with_link   = false;
 
-    //
-    // Keep the borrowed references
-    //
-    pn_incref(pn_link);
-    pn_incref(link->pn_sess);
-
     pn_link_set_context(pn_link, link);
     node->ntype->outgoing_handler(node->context, link);
 }
@@ -184,12 +178,6 @@ static void setup_incoming_link(qd_container_t *container, pn_link_t *pn_link)
     link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(pn_link);
     link->close_sess_with_link = false;
 
-    //
-    // Keep the borrowed references
-    //
-    pn_incref(pn_link);
-    pn_incref(link->pn_sess);
-
     pn_link_set_context(pn_link, link);
     node->ntype->incoming_handler(node->context, link);
 }
@@ -398,7 +386,12 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
             }
         }
         break;
-
+    case PN_SESSION_LOCAL_CLOSE :
+        ssn = pn_event_session(event);
+        if (pn_session_state(ssn) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+            pn_session_free(ssn);
+        }
+        break;
     case PN_SESSION_REMOTE_CLOSE :
         if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
             ssn = pn_event_session(event);
@@ -435,6 +428,9 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
                 }
                 pn_session_close(ssn);
             }
+            else if (pn_session_state(ssn) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+                pn_session_free(ssn);
+            }
         }
         break;
 
@@ -470,6 +466,7 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
             pn_link = pn_event_link(event);
             qd_link = (qd_link_t*) pn_link_get_context(pn_link);
             if (qd_link) {
+                pn_session_t *sess = qd_link->pn_sess;
                 qd_node_t *node = qd_link->node;
                 qd_detach_type_t dt = pn_event_type(event) == PN_LINK_REMOTE_CLOSE ? QD_CLOSED : QD_DETACHED;
                 if (node)
@@ -492,13 +489,26 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
                         assert (qd_conn->n_senders >= 0);
                     }
                 }
-                if (qd_link->close_sess_with_link && qd_link->pn_sess &&
-                    pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED))
-                    pn_session_close(qd_link->pn_sess);
+
+                if (pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+                    if (qd_link->close_sess_with_link && sess) {
+                        pn_session_close(sess);
+                    }
+                    pn_link_free(pn_link);
+                }
             }
         }
         break;
 
+    case PN_LINK_LOCAL_DETACH:
+    case PN_LINK_LOCAL_CLOSE:
+        pn_link = pn_event_link(event);
+        if (pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+            pn_link_free(pn_link);
+        }
+        break;
+
+
     case PN_LINK_FLOW :
         pn_link = pn_event_link(event);
         qd_link = (qd_link_t*) pn_link_get_context(pn_link);
@@ -530,12 +540,9 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
     case PN_CONNECTION_FINAL :
     case PN_SESSION_INIT :
     case PN_SESSION_LOCAL_OPEN :
-    case PN_SESSION_LOCAL_CLOSE :
     case PN_SESSION_FINAL :
     case PN_LINK_INIT :
     case PN_LINK_LOCAL_OPEN :
-    case PN_LINK_LOCAL_CLOSE :
-    case PN_LINK_LOCAL_DETACH :
     case PN_LINK_FINAL :
     case PN_TRANSPORT :
     case PN_TRANSPORT_ERROR :
@@ -779,12 +786,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c
     link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(link->pn_link);
     link->close_sess_with_link = true;
 
-    //
-    // Keep the borrowed references
-    //
-    pn_incref(link->pn_link);
-    pn_incref(link->pn_sess);
-
     pn_link_set_context(link->pn_link, link);
 
     pn_session_open(link->pn_sess);
@@ -796,8 +797,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c
 void qd_link_free(qd_link_t *link)
 {
     if (!link) return;
-    if (link->pn_link) pn_decref(link->pn_link);
-    if (link->pn_sess) pn_decref(link->pn_sess);
     link->pn_link = 0;
     link->pn_sess = 0;
     free_qd_link_t(link);
@@ -942,6 +941,7 @@ void qd_link_close(qd_link_t *link)
     if (link->pn_link)
         pn_link_close(link->pn_link);
 
+
     if (link->close_sess_with_link && link->pn_sess &&
         pn_link_state(link->pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
         pn_session_close(link->pn_sess);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/00c45680/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 1cd054b..a114e1f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -884,6 +884,8 @@ static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, boo
             //
             // No action needed for NORMAL connections
             //
+            qdr_field_free(action->args.connection.connection_label);
+            qdr_field_free(action->args.connection.container_id);
             return;
         }
 
@@ -897,6 +899,8 @@ static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, boo
             else {
                 qd_log(core->log, QD_LOG_CRITICAL, "Exceeded maximum inter-router connection count");
                 conn->role = QDR_ROLE_NORMAL;
+                qdr_field_free(action->args.connection.connection_label);
+                qdr_field_free(action->args.connection.container_id);
                 return;
             }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[4/4] qpid-dispatch git commit: DISPATCH-558 - Removed assertions in core agent that can fail with malformed queries.

Posted by tr...@apache.org.
DISPATCH-558 - Removed assertions in core agent that can fail with malformed queries.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/8ba6302f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/8ba6302f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/8ba6302f

Branch: refs/heads/0.7.x
Commit: 8ba6302ffe6e03c7b583831876d4bb3da2e7bc34
Parents: 4f6d66b
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Nov 3 15:46:48 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 3 15:49:48 2016 -0400

----------------------------------------------------------------------
 src/router_core/agent.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/8ba6302f/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 16dd30b..5b46e01 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -245,8 +245,8 @@ static void qdr_agent_emit_columns(qdr_query_t *query, const char *qdr_columns[]
     qd_compose_start_list(query->body);
     int i = 0;
     while (query->columns[i] >= 0) {
-        assert(query->columns[i] < column_count);
-        qd_compose_insert_string(query->body, qdr_columns[query->columns[i]]);
+        if (query->columns[i] < column_count)
+            qd_compose_insert_string(query->body, qdr_columns[query->columns[i]]);
         i++;
     }
     qd_compose_end_list(query->body);
@@ -266,11 +266,12 @@ static void qdr_agent_set_columns(qdr_query_t *query,
         // Either the attribute_names field is absent, it's not a list, or it's an empty list.
         // In this case, we will include all available attributes.
         //
+        if (column_count > QDR_AGENT_MAX_COLUMNS)
+            column_count = QDR_AGENT_MAX_COLUMNS;
         int i;
         for (i = 0; i < column_count; i++)
             query->columns[i] = i;
         query->columns[i] = -1;
-        assert(i < QDR_AGENT_MAX_COLUMNS);
         return;
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/4] qpid-dispatch git commit: DISPATCH-553 - Resolve the issue of concurrent access to the message-annotations when fanout is greater than one.

Posted by tr...@apache.org.
DISPATCH-553 - Resolve the issue of concurrent access to the message-annotations when fanout is greater than one.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/4f6d66b5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/4f6d66b5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/4f6d66b5

Branch: refs/heads/0.7.x
Commit: 4f6d66b58cb06684387f08b99a8efefbcfd0ff0e
Parents: a139fd0
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Nov 3 10:41:07 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 3 10:55:53 2016 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/ctools.h |  1 +
 include/qpid/dispatch/parse.h  |  8 +++++++
 src/message.c                  |  9 ++++----
 src/parse.c                    | 43 +++++++++++++++++++++++++++++++------
 4 files changed, 51 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f6d66b5/include/qpid/dispatch/ctools.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/ctools.h b/include/qpid/dispatch/ctools.h
index 863033b..1b5d0d3 100644
--- a/include/qpid/dispatch/ctools.h
+++ b/include/qpid/dispatch/ctools.h
@@ -25,6 +25,7 @@
 
 #include <stdlib.h>
 #include <assert.h>
+#include <memory.h>
 
 #define CT_ASSERT(exp) { assert(exp); }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f6d66b5/include/qpid/dispatch/parse.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/parse.h b/include/qpid/dispatch/parse.h
index d38a5fa..d4fdf42 100644
--- a/include/qpid/dispatch/parse.h
+++ b/include/qpid/dispatch/parse.h
@@ -50,6 +50,14 @@ qd_parsed_field_t *qd_parse(qd_field_iterator_t *iter);
 void qd_parse_free(qd_parsed_field_t *field);
 
 /**
+ * Create a duplicate parsed field, referring to the same base data.
+ *
+ * @param field A field pointer returned by qd_parse.
+ * @return A separate field that is a duplicate of the supplied field.
+ */
+qd_parsed_field_t *qd_parse_dup(const qd_parsed_field_t *field);
+
+/**
  * Check to see if the field parse was successful (i.e. the field was
  * well-formed).
  *

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f6d66b5/src/message.c
----------------------------------------------------------------------
diff --git a/src/message.c b/src/message.c
index 33f0ea9..03586ee 100644
--- a/src/message.c
+++ b/src/message.c
@@ -559,8 +559,8 @@ qd_message_t *qd_message()
         return 0;
     }
 
-    memset(msg->content, 0, sizeof(qd_message_content_t));
-    msg->content->lock        = sys_mutex();
+    ZERO(msg->content);
+    msg->content->lock = sys_mutex();
     sys_atomic_init(&msg->content->ref_count, 1);
     msg->content->parse_depth = QD_DEPTH_NONE;
     msg->content->parsed_message_annotations = 0;
@@ -796,8 +796,7 @@ static void compose_message_annotations(qd_message_pvt_t *msg, qd_buffer_list_t
     bool map_started = false;
 
     //We will have to add the custom annotations
-    qd_parsed_field_t   *in_ma = msg->content->parsed_message_annotations;
-
+    qd_parsed_field_t *in_ma = qd_parse_dup(msg->content->parsed_message_annotations);
     if (in_ma) {
         uint32_t count = qd_parse_sub_count(in_ma);
 
@@ -818,6 +817,8 @@ static void compose_message_annotations(qd_message_pvt_t *msg, qd_buffer_list_t
                 qd_compose_insert_typed_iterator(out_ma, qd_parse_typed(sub_value));
             }
         }
+
+        qd_parse_free(in_ma);
     }
 
     //Add the dispatch router specific annotations only if strip_annotations is false.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f6d66b5/src/parse.c
----------------------------------------------------------------------
diff --git a/src/parse.c b/src/parse.c
index 091c32e..d185d52 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -26,12 +26,12 @@ DEQ_DECLARE(qd_parsed_field_t, qd_parsed_field_list_t);
 
 struct qd_parsed_field_t {
     DEQ_LINKS(qd_parsed_field_t);
-    qd_parsed_field_t      *parent;
-    qd_parsed_field_list_t  children;
-    uint8_t                 tag;
-    qd_field_iterator_t    *raw_iter;
-    qd_field_iterator_t    *typed_iter;
-    const char             *parse_error;
+    const qd_parsed_field_t *parent;
+    qd_parsed_field_list_t   children;
+    uint8_t                  tag;
+    qd_field_iterator_t     *raw_iter;
+    qd_field_iterator_t     *typed_iter;
+    const char              *parse_error;
 };
 
 ALLOC_DECLARE(qd_parsed_field_t);
@@ -194,6 +194,37 @@ void qd_parse_free(qd_parsed_field_t *field)
 }
 
 
+static qd_parsed_field_t *qd_parse_dup_internal(const qd_parsed_field_t *field, const qd_parsed_field_t *parent)
+{
+    qd_parsed_field_t *dup = new_qd_parsed_field_t();
+
+    if (dup == 0)
+        return 0;
+
+    ZERO(dup);
+    dup->parent      = parent;
+    dup->tag         = field->tag;
+    dup->raw_iter    = qd_field_iterator_dup(field->raw_iter);
+    dup->typed_iter  = qd_field_iterator_dup(field->typed_iter);
+    dup->parse_error = field->parse_error;
+
+    qd_parsed_field_t *child = DEQ_HEAD(field->children);
+    while (child) {
+        qd_parsed_field_t *dup_child = qd_parse_dup_internal(child, field);
+        DEQ_INSERT_TAIL(dup->children, dup_child);
+        child = DEQ_NEXT(child);
+    }
+
+    return dup;
+}
+
+
+qd_parsed_field_t *qd_parse_dup(const qd_parsed_field_t *field)
+{
+    return field ? qd_parse_dup_internal(field, 0) : 0;
+}
+
+
 int qd_parse_ok(qd_parsed_field_t *field)
 {
     return field->parse_error == 0;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/4] qpid-dispatch git commit: DISPATCH-550 - Remove closed links from the routing tables immediately upon link/connection closure.

Posted by tr...@apache.org.
DISPATCH-550 - Remove closed links from the routing tables immediately upon link/connection closure.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/a139fd0f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/a139fd0f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/a139fd0f

Branch: refs/heads/0.7.x
Commit: a139fd0fb0a1fec64c73255ab7552b671ff2e7c0
Parents: 00c4568
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Oct 28 12:58:38 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 3 10:55:49 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c         |  9 +++++++++
 src/router_core/forwarder.c           | 10 +++++-----
 src/router_core/route_tables.c        |  9 +++------
 src/router_core/router_core_private.h |  6 ++++--
 4 files changed, 21 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index a114e1f..4dabeeb 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -452,6 +452,15 @@ static void qdr_link_cleanup_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_li
     }
 
     //
+    // If this link is involved in inter-router communication, remove its reference
+    // from the core mask-bit tables
+    //
+    if (link->link_type == QD_LINK_CONTROL)
+        core->control_links_by_mask_bit[conn->mask_bit] = 0;
+    if (link->link_type == QD_LINK_ROUTER)
+        core->data_links_by_mask_bit[conn->mask_bit] = 0;
+
+    //
     // Clean up the lists of deliveries on this link
     //
     qdr_delivery_ref_list_t updated_deliveries;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index ca1acb1..cfbb319 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -284,7 +284,7 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
             else
                 next_node = rnode;
 
-            dest_link = control ? next_node->peer_control_link : next_node->peer_data_link;
+            dest_link = control ? PEER_CONTROL_LINK(core, next_node) : PEER_DATA_LINK(core, next_node);
             if (dest_link && qd_bitmask_value(rnode->valid_origins, origin))
                 qd_bitmask_set_bit(link_set, dest_link->conn->mask_bit);
         }
@@ -430,7 +430,7 @@ int qdr_forward_closest_CT(qdr_core_t      *core,
             else
                 next_node = rnode;
 
-            out_link = control ? next_node->peer_control_link : next_node->peer_data_link;
+            out_link = control ? PEER_CONTROL_LINK(core, next_node) : PEER_DATA_LINK(core, next_node);
             if (out_link) {
                 out_delivery = qdr_forward_new_delivery_CT(core, in_delivery, out_link, msg);
                 qdr_forward_deliver_CT(core, out_link, out_delivery);
@@ -532,7 +532,7 @@ int qdr_forward_balanced_CT(qdr_core_t      *core,
         for (QD_BITMASK_EACH(addr->rnodes, node_bit, c)) {
             qdr_node_t *rnode     = core->routers_by_mask_bit[node_bit];
             qdr_node_t *next_node = rnode->next_hop ? rnode->next_hop : rnode;
-            qdr_link_t *link      = next_node->peer_data_link;
+            qdr_link_t *link      = PEER_DATA_LINK(core, next_node);
             if (!link) continue;
             int         link_bit  = link->conn->mask_bit;
             int         value     = addr->outstanding_deliveries[link_bit];
@@ -659,8 +659,8 @@ bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
                 else
                     next_node = rnode;
 
-                if (next_node && next_node->peer_data_link)
-                    conn = next_node->peer_data_link->conn;
+                if (next_node && PEER_DATA_LINK(core, next_node))
+                    conn = PEER_DATA_LINK(core, next_node)->conn;
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index d80930b..6f44e5c 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -295,8 +295,7 @@ static void qdr_add_router_CT(qdr_core_t *core, qdr_action_t *action, bool disca
         rnode->owning_addr       = addr;
         rnode->mask_bit          = router_maskbit;
         rnode->next_hop          = 0;
-        rnode->peer_control_link = 0;
-        rnode->peer_data_link    = 0;
+        rnode->link_mask_bit     = -1;
         rnode->ref_count         = 0;
         rnode->valid_origins     = qd_bitmask(0);
         rnode->cost              = 0;
@@ -423,8 +422,7 @@ static void qdr_set_link_CT(qdr_core_t *core, qdr_action_t *action, bool discard
     // Add the peer_link reference to the router record.
     //
     qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
-    rnode->peer_control_link = core->control_links_by_mask_bit[link_maskbit];
-    rnode->peer_data_link    = core->data_links_by_mask_bit[link_maskbit];
+    rnode->link_mask_bit = link_maskbit;
 }
 
 
@@ -443,8 +441,7 @@ static void qdr_remove_link_CT(qdr_core_t *core, qdr_action_t *action, bool disc
     }
 
     qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
-    rnode->peer_control_link = 0;
-    rnode->peer_data_link    = 0;
+    rnode->link_mask_bit = -1;
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/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 9fa86e9..32c112a 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -174,8 +174,7 @@ struct qdr_node_t {
     qdr_address_t    *owning_addr;
     int               mask_bit;
     qdr_node_t       *next_hop;           ///< Next hop node _if_ this is not a neighbor node
-    qdr_link_t       *peer_control_link;  ///< Outgoing control link _if_ this is a neighbor node
-    qdr_link_t       *peer_data_link;     ///< Outgoing data link _if_ this is a neighbor node
+    int               link_mask_bit;      ///< Mask bit of inter-router connection if this is a neighbor node
     uint32_t          ref_count;
     qd_bitmask_t     *valid_origins;
     int               cost;
@@ -184,6 +183,9 @@ struct qdr_node_t {
 ALLOC_DECLARE(qdr_node_t);
 DEQ_DECLARE(qdr_node_t, qdr_node_list_t);
 
+#define PEER_CONTROL_LINK(c,n) ((n->link_mask_bit >= 0) ? (c)->control_links_by_mask_bit[n->link_mask_bit] : 0)
+#define PEER_DATA_LINK(c,n)    ((n->link_mask_bit >= 0) ? (c)->data_links_by_mask_bit[n->link_mask_bit] : 0)
+
 
 struct qdr_router_ref_t {
     DEQ_LINKS(qdr_router_ref_t);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org