Author: tross
Date: Mon Feb  2 13:30:15 2015
New Revision: 1656457

URL: http://svn.apache.org/r1656457
Log:
DISPATCH-6 - Completed link-detach propagation.

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

Modified: qpid/dispatch/trunk/src/router_node.c
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_node.c?rev=1656457&r1=1656456&r2=1656457&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_node.c (original)
+++ qpid/dispatch/trunk/src/router_node.c Mon Feb  2 13:30:15 2015
@@ -1034,6 +1034,16 @@ typedef struct link_attach_t {
 ALLOC_DECLARE(link_attach_t);
 ALLOC_DEFINE(link_attach_t);
 
+
+typedef struct link_detach_t {
+    qd_router_t      *router;
+    qd_router_link_t *rlink;
+} link_detach_t;
+
+ALLOC_DECLARE(link_detach_t);
+ALLOC_DEFINE(link_detach_t);
+
+
 typedef enum {
     LINK_ATTACH_FORWARDED = 1,  ///< The attach was forwarded
     LINK_ATTACH_NO_MATCH  = 2,  ///< No link-route address was found
@@ -1082,6 +1092,24 @@ static void qd_router_attach_routed_link
 }
 
 
+static void qd_router_detach_routed_link(void *context, bool discard)
+{
+    link_detach_t *ld = (link_detach_t*) context;
+
+    if (!discard) {
+        qd_link_t *link = ld->rlink->link;
+        qd_link_close(link);
+
+        sys_mutex_lock(ld->router->lock);
+        qd_entity_cache_remove(QD_ROUTER_LINK_TYPE, ld->rlink);
+        DEQ_REMOVE(ld->router->links, ld->rlink);
+        sys_mutex_unlock(ld->router->lock);
+    }
+
+    free_link_detach_t(ld);
+}
+
+
 link_attach_result_t qd_router_link_route(qd_router_t      *router,
                                           qd_router_link_t *rlink,
                                           const char       *term_addr,
@@ -1383,6 +1411,15 @@ static int router_link_detach_handler(vo
 
     sys_mutex_lock(router->lock);
 
+    if (rlink->connected_link) {
+        qd_connection_t *out_conn = 
qd_link_connection(rlink->connected_link->link);
+        link_detach_t   *ld       = new_link_detach_t();
+        ld->router  = router;
+        ld->rlink   = rlink->connected_link;
+        rlink->connected_link->connected_link = 0;
+        qd_connection_invoke_deferred(out_conn, qd_router_detach_routed_link, 
ld);
+    }
+
     //
     // If this link is part of an inter-router connection, drop the
     // reference count.  If this is the last link on the connection,



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

Reply via email to