Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 99d0377f0 -> a357dfa3e


DISPATCH-1141 - Consolidated address to link/connection binding, wired in the 
core address events


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

Branch: refs/heads/master
Commit: a357dfa3ef0aaf01a7e88d96e443ff68b00355d2
Parents: 99d0377
Author: Ted Ross <[email protected]>
Authored: Fri Oct 12 16:58:29 2018 -0400
Committer: Ted Ross <[email protected]>
Committed: Fri Oct 12 16:58:29 2018 -0400

----------------------------------------------------------------------
 src/router_core/connections.c                   | 84 ++++++--------------
 src/router_core/exchange_bindings.c             |  6 +-
 src/router_core/module.h                        |  2 +-
 .../modules/edge_router/addr_proxy.c            | 23 +++++-
 src/router_core/route_control.c                 | 27 ++-----
 src/router_core/route_tables.c                  | 20 ++++-
 src/router_core/router_core.c                   | 56 +++++++++++++
 src/router_core/router_core_private.h           |  6 +-
 src/router_core/transfer.c                      |  4 +-
 9 files changed, 132 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 041e0f0..c08da13 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -749,7 +749,7 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t 
*core, qdr_connection_t *c
             dlv->tracking_addr->tracked_deliveries--;
 
             if (dlv->tracking_addr->tracked_deliveries == 0)
-                qdr_check_addr_CT(core, dlv->tracking_addr, false);
+                qdr_check_addr_CT(core, dlv->tracking_addr);
 
             dlv->tracking_addr = 0;
         }
@@ -1077,29 +1077,23 @@ qd_address_treatment_t 
qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_it
  * Depending on its policy, the address may be eligible for being closed out
  * (i.e. Logging its terminal statistics and freeing its resources).
  */
-void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local)
+void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr)
 {
     if (addr == 0)
         return;
 
     //
-    // If we have just removed a local linkage and it was the last local 
linkage,
-    // we need to notify the router module that there is no longer a local
-    // presence of this address.
-    //
-    if (was_local && DEQ_SIZE(addr->rlinks) == 0) {
-        const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
-        if (key && (*key == QD_ITER_HASH_PREFIX_MOBILE || *key == 
QD_ITER_HASH_PREFIX_EDGE_SUMMARY))
-            qdr_post_mobile_removed_CT(core, key);
-    }
-
-    //
     // If the address has no in-process consumer or destinations, it should be
     // deleted.
     //
-    if (DEQ_SIZE(addr->subscriptions) == 0 && DEQ_SIZE(addr->rlinks) == 0 && 
DEQ_SIZE(addr->inlinks) == 0 &&
-        qd_bitmask_cardinality(addr->rnodes) == 0 && addr->ref_count == 0 && 
!addr->block_deletion &&
-        addr->tracked_deliveries == 0 && addr->core_endpoint == 0) {
+    if (DEQ_SIZE(addr->subscriptions) == 0
+        && DEQ_SIZE(addr->rlinks) == 0
+        && DEQ_SIZE(addr->inlinks) == 0
+        && qd_bitmask_cardinality(addr->rnodes) == 0
+        && addr->ref_count == 0
+        && !addr->block_deletion
+        && addr->tracked_deliveries == 0
+        && addr->core_endpoint == 0) {
         qdr_core_remove_address(core, addr);
     }
 }
@@ -1501,14 +1495,7 @@ static void qdr_attach_link_downlink_CT(qdr_core_t 
*core, qdr_connection_t *conn
         DEQ_INSERT_TAIL(core->addrs, addr);
     }
 
-    qdr_add_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
-    link->owning_addr = addr;
-    if (DEQ_SIZE(addr->rlinks) == 1) {
-        const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
-        if (key && *key == QD_ITER_HASH_PREFIX_EDGE_SUMMARY)
-            qdr_post_mobile_added_CT(core, key);
-        qdr_addr_start_inlinks_CT(core, addr);
-    }
+    qdr_core_bind_address_link_CT(core, addr, link);
 
     qd_iterator_free(iter);
 }
@@ -1632,14 +1619,12 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t 
*core, qdr_action_t *act
                     // Now, send back a detach with the error 
amqp:precondition-failed
                     qdr_link_outbound_detach_CT(core, link, 0, 
QDR_CONDITION_COORDINATOR_PRECONDITION_FAILED, true);
                 }
-                else
-                    {
+                else {
                     //
                     // Associate the link with the address.  With this 
association, it will be unnecessary
                     // to do an address lookup for deliveries that arrive on 
this link.
                     //
-                    link->owning_addr = addr;
-                    qdr_add_link_ref(&addr->inlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
+                    qdr_core_bind_address_link_CT(core, addr, link);
                     qdr_link_outbound_second_attach_CT(core, link, source, 
target);
 
                     //
@@ -1722,17 +1707,7 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t 
*core, qdr_action_t *act
             }
 
             else {
-                //
-                // Associate the link with the address.
-                //
-                link->owning_addr = addr;
-                qdr_add_link_ref(&addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-                if (DEQ_SIZE(addr->rlinks) == 1) {
-                    const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
-                    if (key && *key == QD_ITER_HASH_PREFIX_MOBILE)
-                        qdr_post_mobile_added_CT(core, key);
-                    qdr_addr_start_inlinks_CT(core, addr);
-                }
+                qdr_core_bind_address_link_CT(core, addr, link);
                 qdr_link_outbound_second_attach_CT(core, link, source, target);
             }
             break;
@@ -1803,8 +1778,7 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t 
*core, qdr_action_t *ac
                 //
                 if (qdr_terminus_get_address(source)) {
                     link->auto_link->state = QDR_AUTO_LINK_STATE_ACTIVE;
-                    qdr_add_link_ref(&link->auto_link->addr->inlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-                    link->owning_addr = link->auto_link->addr;
+                    qdr_core_bind_address_link_CT(core, link->auto_link->addr, 
link);
                 }
             }
 
@@ -1837,14 +1811,7 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t 
*core, qdr_action_t *ac
                 //
                 if (qdr_terminus_get_address(target)) {
                     link->auto_link->state = QDR_AUTO_LINK_STATE_ACTIVE;
-                    qdr_add_link_ref(&link->auto_link->addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-                    link->owning_addr = link->auto_link->addr;
-                    if (DEQ_SIZE(link->auto_link->addr->rlinks) == 1) {
-                        const char *key = (const char*) 
qd_hash_key_by_handle(link->auto_link->addr->hash_handle);
-                        if (key && *key == QD_ITER_HASH_PREFIX_MOBILE)
-                            qdr_post_mobile_added_CT(core, key);
-                        qdr_addr_start_inlinks_CT(core, link->auto_link->addr);
-                    }
+                    qdr_core_bind_address_link_CT(core, link->auto_link->addr, 
link);
                 }
             }
             break;
@@ -1872,12 +1839,11 @@ static void qdr_link_inbound_detach_CT(qdr_core_t 
*core, qdr_action_t *action, b
     if (discard)
         return;
 
-    qdr_connection_t *conn      = action->args.connection.conn;
-    qdr_link_t       *link      = action->args.connection.link;
-    qdr_error_t      *error     = action->args.connection.error;
-    qd_detach_type_t  dt        = action->args.connection.dt;
-    qdr_address_t    *addr      = link->owning_addr;
-    bool              was_local = false;
+    qdr_connection_t *conn  = action->args.connection.conn;
+    qdr_link_t       *link  = action->args.connection.link;
+    qdr_error_t      *error = action->args.connection.error;
+    qd_detach_type_t  dt    = action->args.connection.dt;
+    qdr_address_t    *addr  = link->owning_addr;
 
     //
     // Bump the detach count to track half and full detaches
@@ -1970,10 +1936,8 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, 
qdr_action_t *action, b
             switch (link->link_type) {
             case QD_LINK_ENDPOINT:
             case QD_LINK_EDGE_DOWNLINK:
-                if (addr) {
-                    qdr_del_link_ref(&addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-                    was_local = true;
-                }
+                if (addr)
+                    qdr_core_unbind_address_link_CT(core, addr, link);
                 break;
 
             case QD_LINK_CONTROL:
@@ -2010,7 +1974,7 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, 
qdr_action_t *action, b
     // cleanup has to be done.
     //
     if (addr)
-        qdr_check_addr_CT(core, addr, was_local);
+        qdr_check_addr_CT(core, addr);
 
     if (error)
         qdr_error_free(error);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/exchange_bindings.c
----------------------------------------------------------------------
diff --git a/src/router_core/exchange_bindings.c 
b/src/router_core/exchange_bindings.c
index 215c68a..43a5ca4 100644
--- a/src/router_core/exchange_bindings.c
+++ b/src/router_core/exchange_bindings.c
@@ -955,8 +955,7 @@ static void qdr_exchange_free(qdr_exchange_t *ex)
     ex->qdr_addr->forwarder = ex->old_forwarder;
     assert(ex->qdr_addr->ref_count > 0);
     ex->qdr_addr->ref_count -= 1;
-    qdr_check_addr_CT(ex->core, ex->qdr_addr, false); // @TODO(kgiusti) ?is
-                                                      // false correct ?
+    qdr_check_addr_CT(ex->core, ex->qdr_addr);
     free(ex->name);
     free(ex->address);
 
@@ -1066,8 +1065,7 @@ static void next_hop_release(next_hop_t *nh)
     if (--nh->ref_count == 0) {
         assert(nh->qdr_addr->ref_count > 0);
         if (--nh->qdr_addr->ref_count == 0) {
-            // @TODO(kgiusti) is 'false' ok?
-            qdr_check_addr_CT(nh->exchange->core, nh->qdr_addr, false);
+            qdr_check_addr_CT(nh->exchange->core, nh->qdr_addr);
         }
         DEQ_REMOVE_N(exchange_list, nh->exchange->next_hops, nh);
         assert(!nh->on_xmit_list);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/module.h
----------------------------------------------------------------------
diff --git a/src/router_core/module.h b/src/router_core/module.h
index d2f44c7..e330146 100644
--- a/src/router_core/module.h
+++ b/src/router_core/module.h
@@ -31,7 +31,7 @@ typedef void (*qdrc_module_init_t) (qdr_core_t *core, void 
**module_context);
 
 
 /**
- * Callback to finailize a core module at core thread shutdown
+ * Callback to finalize a core module at core thread shutdown
  *
  * @param module_context The context returned by the module during the on_init 
call
  */

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/modules/edge_router/addr_proxy.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/edge_router/addr_proxy.c 
b/src/router_core/modules/edge_router/addr_proxy.c
index a71f304..d5dc237 100644
--- a/src/router_core/modules/edge_router/addr_proxy.c
+++ b/src/router_core/modules/edge_router/addr_proxy.c
@@ -76,8 +76,7 @@ static void on_conn_event(void *context, qdrc_event_t event, 
qdr_connection_t *c
         // Associate the anonymous sender with the uplink address.  This will 
cause
         // all deliveries destined off-edge to be sent to the interior via the 
uplink.
         //
-        qdr_add_link_ref(&ap->uplink_addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-        link->owning_addr = ap->uplink_addr;
+        qdr_core_bind_address_link_CT(ap->core, ap->uplink_addr, link);
 
         //
         // Attach a receiving link for edge summary.  This will cause all 
deliveries
@@ -87,6 +86,11 @@ static void on_conn_event(void *context, qdrc_event_t event, 
qdr_connection_t *c
                                   QD_LINK_ENDPOINT, QD_INCOMING,
                                   
qdr_terminus_edge_downlink(ap->core->router_id),
                                   qdr_terminus_edge_downlink(0));
+
+        //
+        // TODO - Process eligible local destinations
+        //
+
         break;
     }
 
@@ -103,7 +107,20 @@ static void on_conn_event(void *context, qdrc_event_t 
event, qdr_connection_t *c
 
 static void on_addr_event(void *context, qdrc_event_t event, qdr_address_t 
*addr)
 {
-    //qcm_edge_addr_proxy_t *ap = (qcm_edge_addr_proxy_t*) context;
+    qcm_edge_addr_proxy_t *ap = (qcm_edge_addr_proxy_t*) context;
+
+    //
+    // If we don't have an established uplink, there is no further work to be 
done.
+    //
+    if (!ap->uplink_established)
+        return;
+
+    //
+    // If the address is not in the Mobile class, no further processing is 
needed.
+    //
+    const char *key = (const char*) qd_hash_key_by_handle(addr->hash_handle);
+    if (*key != QD_ITER_HASH_PREFIX_MOBILE)
+        return;
 
     switch (event) {
     case QDRC_EVENT_ADDR_BECAME_LOCAL_DEST :

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 39771cd..977ac5f 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -188,22 +188,14 @@ static char 
*qdr_address_to_link_route_pattern(qd_iterator_t *addr_hash,
 
 static void qdr_link_route_activate_CT(qdr_core_t *core, qdr_link_route_t *lr, 
qdr_connection_t *conn)
 {
-    char *address;
     qdr_route_log_CT(core, "Link Route Activated", lr->name, lr->identity, 
conn);
 
     //
     // Activate the address for link-routed destinations.  If this is the first
     // activation for this address, notify the router module of the added 
address.
     //
-    if (lr->addr) {
-        qdr_add_connection_ref(&lr->addr->conns, conn);
-        if (DEQ_SIZE(lr->addr->conns) == 1) {
-            address = qdr_link_route_pattern_to_address(lr->pattern, lr->dir);
-            qd_log(core->log, QD_LOG_TRACE, "Activating link route pattern 
[%s]", address);
-            qdr_post_mobile_added_CT(core, address);
-            free(address);
-        }
-    }
+    if (lr->addr)
+        qdr_core_bind_address_conn_CT(core, lr->addr, conn);
 
     lr->active = true;
 }
@@ -216,15 +208,8 @@ static void qdr_link_route_deactivate_CT(qdr_core_t *core, 
qdr_link_route_t *lr,
     //
     // Deactivate the address(es) for link-routed destinations.
     //
-    if (lr->addr) {
-        qdr_del_connection_ref(&lr->addr->conns, conn);
-        if (DEQ_IS_EMPTY(lr->addr->conns)) {
-            char *address = qdr_link_route_pattern_to_address(lr->pattern, 
lr->dir);
-            qd_log(core->log, QD_LOG_TRACE, "Deactivating link route pattern 
[%s]", address);
-            qdr_post_mobile_removed_CT(core, address);
-            free(address);
-        }
-    }
+    if (lr->addr)
+        qdr_core_unbind_address_conn_CT(core, lr->addr, conn);
 
     lr->active = false;
 }
@@ -445,7 +430,7 @@ void qdr_route_del_link_route_CT(qdr_core_t *core, 
qdr_link_route_t *lr)
     //
     qdr_address_t *addr = lr->addr;
     if (addr && --addr->ref_count == 0)
-        qdr_check_addr_CT(core, addr, false);
+        qdr_check_addr_CT(core, addr);
 
     //
     // Remove the link route from the core list.
@@ -545,7 +530,7 @@ void qdr_route_del_auto_link_CT(qdr_core_t *core, 
qdr_auto_link_t *al)
     //
     qdr_address_t *addr = al->addr;
     if (addr && --addr->ref_count == 0)
-        qdr_check_addr_CT(core, addr, false);
+        qdr_check_addr_CT(core, addr);
 
     //
     // Remove the auto link from the core list.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index f9bb1f6..84834fe 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -400,7 +400,7 @@ static void qdr_del_router_CT(qdr_core_t *core, 
qdr_action_t *action, bool disca
     // Check the address and free it if there are no other interested parties 
tracking it
     //
     oaddr->block_deletion = false;
-    qdr_check_addr_CT(core, oaddr, false);
+    qdr_check_addr_CT(core, oaddr);
 }
 
 
@@ -604,6 +604,14 @@ static void qdr_map_destination_CT(qdr_core_t *core, 
qdr_action_t *action, bool
         rnode->ref_count++;
         addr->cost_epoch--;
         qdr_addr_start_inlinks_CT(core, addr);
+
+        //
+        // Raise an address event if this is the first destination for the 
address
+        //
+        if (qd_bitmask_cardinality(addr->rnodes) + DEQ_SIZE(addr->rlinks) == 1)
+            qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_DEST, addr);
+        else if (qd_bitmask_cardinality(addr->rnodes) == 1 && 
DEQ_SIZE(addr->rlinks) == 1)
+            qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_DEST, addr);
     } while (false);
 
     qdr_field_free(address);
@@ -646,10 +654,14 @@ static void qdr_unmap_destination_CT(qdr_core_t *core, 
qdr_action_t *action, boo
         addr->cost_epoch--;
 
         //
-        // TODO - If this affects a waypoint, create the proper side effects
+        // Raise an address event if this was the last destination for the 
address
         //
+        if (qd_bitmask_cardinality(addr->rnodes) + DEQ_SIZE(addr->rlinks) == 0)
+            qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_DEST, addr);
+        else if (qd_bitmask_cardinality(addr->rnodes) == 0 && 
DEQ_SIZE(addr->rlinks) == 1)
+            qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_LOCAL_DEST, addr);
 
-        qdr_check_addr_CT(core, addr, false);
+        qdr_check_addr_CT(core, addr);
     } while (false);
 
     qdr_field_free(address);
@@ -704,7 +716,7 @@ static void qdr_unsubscribe_CT(qdr_core_t *core, 
qdr_action_t *action, bool disc
     if (!discard) {
         DEQ_REMOVE(sub->addr->subscriptions, sub);
         sub->addr = 0;
-        qdr_check_addr_CT(sub->core, sub->addr, false);
+        qdr_check_addr_CT(sub->core, sub->addr);
     }
 
     free(sub);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index aa5d715..f7ddb5b 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -20,6 +20,7 @@
 #include "router_core_private.h"
 #include "route_control.h"
 #include "exchange_bindings.h"
+#include "core_events.h"
 #include <stdio.h>
 #include <strings.h>
 
@@ -406,6 +407,61 @@ void qdr_core_remove_address(qdr_core_t *core, 
qdr_address_t *addr)
     free_qdr_address_t(addr);
 }
 
+
+void qdr_core_bind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_link_t *link)
+{
+    link->owning_addr = addr;
+
+    if (link->link_direction == QD_OUTGOING) {
+        qdr_add_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
+        if (DEQ_SIZE(addr->rlinks) == 1) {
+            const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
+            if (key && (*key == QD_ITER_HASH_PREFIX_EDGE_SUMMARY || *key == 
QD_ITER_HASH_PREFIX_MOBILE))
+                qdr_post_mobile_added_CT(core, key);
+            qdr_addr_start_inlinks_CT(core, addr);
+            qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_LOCAL_DEST, 
addr);
+        } else if (DEQ_SIZE(addr->rlinks) == 2 && 
qd_bitmask_cardinality(addr->rnodes) == 0)
+            qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_DEST, addr);
+    } else  // link->link_direction == QD_INCOMING
+        qdr_add_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
+}
+
+
+void qdr_core_unbind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_link_t *link)
+{
+    qdr_del_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
+    link->owning_addr = 0;
+
+    if (DEQ_SIZE(addr->rlinks) == 0) {
+        const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
+        if (key && (*key == QD_ITER_HASH_PREFIX_MOBILE || *key == 
QD_ITER_HASH_PREFIX_EDGE_SUMMARY))
+            qdr_post_mobile_removed_CT(core, key);
+        qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST, 
addr);
+    } else if (DEQ_SIZE(addr->rlinks) == 1 && 
qd_bitmask_cardinality(addr->rnodes) == 0)
+        qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_LOCAL_DEST, addr);
+}
+
+
+void qdr_core_bind_address_conn_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_connection_t *conn)
+{
+    qdr_add_connection_ref(&addr->conns, conn);
+    if (DEQ_SIZE(addr->conns) == 1) {
+        const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
+        qdr_post_mobile_added_CT(core, key);
+    }
+}
+
+
+void qdr_core_unbind_address_conn_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_connection_t *conn)
+{
+    qdr_del_connection_ref(&addr->conns, conn);
+    if (DEQ_IS_EMPTY(addr->conns)) {
+        const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
+        qdr_post_mobile_removed_CT(core, key);
+    }
+}
+
+
 void qdr_core_remove_address_config(qdr_core_t *core, qdr_address_config_t 
*addr)
 {
     qd_iterator_t *pattern = qd_iterator_string(addr->pattern, ITER_VIEW_ALL);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/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 d1ea32a..c027dc4 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -528,6 +528,10 @@ qdr_address_t *qdr_address_CT(qdr_core_t *core, 
qd_address_treatment_t treatment
 qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const 
char *addr, qd_address_treatment_t treatment);
 qdr_address_t *qdr_add_mobile_address_CT(qdr_core_t *core, const char* prefix, 
const char *addr, qd_address_treatment_t treatment, bool edge);
 void qdr_core_remove_address(qdr_core_t *core, qdr_address_t *addr);
+void qdr_core_bind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_link_t *link);
+void qdr_core_unbind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_link_t *link);
+void qdr_core_bind_address_conn_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_connection_t *conn);
+void qdr_core_unbind_address_conn_CT(qdr_core_t *core, qdr_address_t *addr, 
qdr_connection_t *conn);
 
 struct qdr_address_config_t {
     DEQ_LINKS(qdr_address_config_t);
@@ -865,7 +869,7 @@ void qdr_post_mobile_removed_CT(qdr_core_t *core, const 
char *address_hash);
 void qdr_post_link_lost_CT(qdr_core_t *core, int link_maskbit);
 
 void qdr_post_general_work_CT(qdr_core_t *core, qdr_general_work_t *work);
-void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local);
+void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr);
 bool qdr_is_addr_treatment_multicast(qdr_address_t *addr);
 qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t 
*peer, qdr_link_t *link, qd_message_t *msg);
 void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t 
*dlv);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a357dfa3/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 361e2e1..b011f5f 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -498,7 +498,7 @@ bool qdr_delivery_settled_CT(qdr_core_t *core, 
qdr_delivery_t *dlv)
         dlv->tracking_addr->tracked_deliveries--;
 
         if (dlv->tracking_addr->tracked_deliveries == 0)
-            qdr_check_addr_CT(core, dlv->tracking_addr, false);
+            qdr_check_addr_CT(core, dlv->tracking_addr);
 
         dlv->tracking_addr = 0;
     }
@@ -542,7 +542,7 @@ static void qdr_delete_delivery_internal_CT(qdr_core_t 
*core, qdr_delivery_t *de
         delivery->tracking_addr->tracked_deliveries--;
 
         if (delivery->tracking_addr->tracked_deliveries == 0)
-            qdr_check_addr_CT(core, delivery->tracking_addr, false);
+            qdr_check_addr_CT(core, delivery->tracking_addr);
 
         delivery->tracking_addr = 0;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to