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