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 2013/10/09 00:46:56 UTC

svn commit: r1530454 - /qpid/trunk/qpid/extras/dispatch/src/router_node.c

Author: tross
Date: Tue Oct  8 22:46:56 2013
New Revision: 1530454

URL: http://svn.apache.org/r1530454
Log:
QPID-4967 - Bug fixes and added clean-up for unused addresses.

Modified:
    qpid/trunk/qpid/extras/dispatch/src/router_node.c

Modified: qpid/trunk/qpid/extras/dispatch/src/router_node.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/router_node.c?rev=1530454&r1=1530453&r2=1530454&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/router_node.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/router_node.c Tue Oct  8 22:46:56 2013
@@ -106,9 +106,18 @@ void dx_router_del_node_ref_LH(dx_router
  * Depending on its policy, the address may be eligible for being closed out
  * (i.e. Logging its terminal statistics and freeing its resources).
  */
-static void dx_router_check_addr_LH(dx_address_t *addr)
+static void dx_router_check_addr_LH(dx_router_t *router, dx_address_t *addr)
 {
-    // TODO
+    if (addr == 0)
+        return;
+
+    if (addr->handler || DEQ_SIZE(addr->rlinks) > 0 || DEQ_SIZE(addr->rnodes) > 0)
+        return;
+
+    dx_hash_remove_by_handle(router->addr_hash, addr->hash_handle);
+    DEQ_REMOVE(router->addrs, addr);
+    dx_hash_handle_free(addr->hash_handle);
+    free_dx_address_t(addr);
 }
 
 
@@ -537,7 +546,7 @@ static void router_rx_handler(void* cont
                             while (dx_bitmask_first_set(link_set, &link_bit)) {
                                 dx_bitmask_clear_bit(link_set, link_bit);
                                 dest_link = router->out_links_by_mask_bit[link_bit];
-                                if (link) {
+                                if (dest_link) {
                                     dx_routed_event_t *re = new_dx_routed_event_t();
                                     DEQ_ITEM_INIT(re);
                                     re->delivery    = 0;
@@ -811,7 +820,7 @@ static int router_link_detach_handler(vo
     //
     if (rlink->link_direction == DX_OUTGOING && rlink->owning_addr) {
         dx_router_del_link_ref_LH(&rlink->owning_addr->rlinks, rlink);
-        dx_router_check_addr_LH(rlink->owning_addr);
+        dx_router_check_addr_LH(router, rlink->owning_addr);
     }
 
     //
@@ -1131,15 +1140,25 @@ void dx_router_send(dx_dispatch_t       
 
         //
         // Forward to the next-hops for remote destinations.
-        // FIXME - use link-mask to avoid dups.
         //
         dx_router_ref_t  *dest_node_ref = DEQ_HEAD(addr->rnodes);
         dx_router_link_t *dest_link;
+        dx_bitmask_t     *link_set = dx_bitmask(0);
+
         while (dest_node_ref) {
             if (dest_node_ref->router->next_hop)
                 dest_link = dest_node_ref->router->next_hop->peer_link;
             else
                 dest_link = dest_node_ref->router->peer_link;
+            if (dest_link)
+                dx_bitmask_set_bit(link_set, dest_link->mask_bit);
+            dest_node_ref = DEQ_NEXT(dest_node_ref);
+        }
+
+        int link_bit;
+        while (dx_bitmask_first_set(link_set, &link_bit)) {
+            dx_bitmask_clear_bit(link_set, link_bit);
+            dest_link = router->out_links_by_mask_bit[link_bit];
             if (dest_link) {
                 dx_routed_event_t *re = new_dx_routed_event_t();
                 DEQ_ITEM_INIT(re);
@@ -1151,8 +1170,9 @@ void dx_router_send(dx_dispatch_t       
                 dx_link_activate(dest_link->link);
                 addr->deliveries_transit++;
             }
-            dest_node_ref = DEQ_NEXT(dest_node_ref);
         }
+
+        dx_bitmask_free(link_set);
     }
     sys_mutex_unlock(router->lock); // TOINVESTIGATE Move this higher?
 }



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