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 2015/02/02 14:30:16 UTC
svn commit: r1656457 - /qpid/dispatch/trunk/src/router_node.c
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org