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/12/05 18:16:21 UTC

svn commit: r1548209 - in /qpid/dispatch/trunk: include/qpid/dispatch/container.h src/container.c src/router_node.c

Author: tross
Date: Thu Dec  5 17:16:21 2013
New Revision: 1548209

URL: http://svn.apache.org/r1548209
Log:
QPID-5397 - Added a global lock to protect the linking and unlinking of peered deliveries.

Modified:
    qpid/dispatch/trunk/include/qpid/dispatch/container.h
    qpid/dispatch/trunk/src/container.c
    qpid/dispatch/trunk/src/router_node.c

Modified: qpid/dispatch/trunk/include/qpid/dispatch/container.h
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/include/qpid/dispatch/container.h?rev=1548209&r1=1548208&r2=1548209&view=diff
==============================================================================
--- qpid/dispatch/trunk/include/qpid/dispatch/container.h (original)
+++ qpid/dispatch/trunk/include/qpid/dispatch/container.h Thu Dec  5 17:16:21 2013
@@ -185,7 +185,7 @@ bool qd_link_drain_changed(qd_link_t *li
  */
 qd_delivery_t *qd_delivery(qd_link_t *link, pn_delivery_tag_t tag);
 void qd_delivery_free(qd_delivery_t *delivery, uint64_t final_disposition);
-void qd_delivery_set_peer(qd_delivery_t *delivery, qd_delivery_t *peer);
+void qd_delivery_link_peers(qd_delivery_t *left, qd_delivery_t *right);
 qd_delivery_t *qd_delivery_peer(qd_delivery_t *delivery);
 void qd_delivery_set_context(qd_delivery_t *delivery, void *context);
 void *qd_delivery_context(qd_delivery_t *delivery);

Modified: qpid/dispatch/trunk/src/container.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/container.c?rev=1548209&r1=1548208&r2=1548209&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/container.c (original)
+++ qpid/dispatch/trunk/src/container.c Thu Dec  5 17:16:21 2013
@@ -89,6 +89,8 @@ static int QD_CONTAINER_CLASS_CONTAINER 
 static int QD_CONTAINER_CLASS_NODE_TYPE = 2;
 static int QD_CONTAINER_CLASS_NODE      = 3;
 
+static sys_mutex_t *delivery_lock = 0;
+
 typedef struct container_class_t {
     qd_container_t *container;
     int             class_id;
@@ -483,6 +485,9 @@ qd_container_t *qd_container(qd_dispatch
     qd_log(module, LOG_TRACE, "Container Initializing");
     qd_server_set_conn_handler(qd, handler, container);
 
+    if (!delivery_lock)
+        delivery_lock = sys_mutex();
+
     return container;
 }
 
@@ -822,15 +827,20 @@ void qd_delivery_free(qd_delivery_t *del
         pn_delivery_set_context(delivery->pn_delivery, 0);
         pn_delivery_settle(delivery->pn_delivery);
     }
+    sys_mutex_lock(delivery_lock);
     if (delivery->peer)
         delivery->peer->peer = 0;
+    sys_mutex_unlock(delivery_lock);
     free_qd_delivery_t(delivery);
 }
 
 
-void qd_delivery_set_peer(qd_delivery_t *delivery, qd_delivery_t *peer)
+void qd_delivery_link_peers(qd_delivery_t *right, qd_delivery_t *left)
 {
-    delivery->peer = peer;
+    sys_mutex_lock(delivery_lock);
+    right->peer = left;
+    left->peer  = right;
+    sys_mutex_unlock(delivery_lock);
 }
 
 

Modified: qpid/dispatch/trunk/src/router_node.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_node.c?rev=1548209&r1=1548208&r2=1548209&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_node.c (original)
+++ qpid/dispatch/trunk/src/router_node.c Thu Dec  5 17:16:21 2013
@@ -323,10 +323,9 @@ static int router_writable_link_handler(
         // with the outgoing delivery.  Otherwise, the message arrived pre-settled
         // and should be sent presettled.
         //
-        if (re->delivery) {
-            qd_delivery_set_peer(re->delivery, delivery);
-            qd_delivery_set_peer(delivery, re->delivery);
-        } else
+        if (re->delivery)
+            qd_delivery_link_peers(re->delivery, delivery);
+        else
             qd_delivery_free(delivery, 0);  // settle and free
 
         pn_link_advance(pn_link);
@@ -734,7 +733,6 @@ static void router_disp_handler(void* co
 
             qd_link_activate(peer_link);
         }
-
     }
 
     //
@@ -1184,6 +1182,12 @@ qd_router_t *qd_router(qd_dispatch_t *qd
     //
     qd_python_start();
 
+    //
+    // Seed the random number generator
+    //
+    unsigned int seed = (unsigned int) time(0);
+    srandom(seed);
+
     switch (router->router_mode) {
     case QD_ROUTER_MODE_STANDALONE:  qd_log(module, LOG_INFO, "Router started in Standalone mode");  break;
     case QD_ROUTER_MODE_INTERIOR:    qd_log(module, LOG_INFO, "Router started in Interior mode, area=%s id=%s", area, id);  break;



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