diff options
Diffstat (limited to 'cpp/src/qpid/broker/Exchange.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/Exchange.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/cpp/src/qpid/broker/Exchange.cpp b/cpp/src/qpid/broker/Exchange.cpp index 442246d971..fe388c2fe9 100644 --- a/cpp/src/qpid/broker/Exchange.cpp +++ b/cpp/src/qpid/broker/Exchange.cpp @@ -30,6 +30,7 @@ using namespace qpid::broker; using namespace qpid::framing; using qpid::framing::Buffer; using qpid::framing::FieldTable; +using qpid::sys::Mutex; using qpid::management::ManagementAgent; using qpid::management::ManagementObject; using qpid::management::Manageable; @@ -180,11 +181,15 @@ void Exchange::registerDynamicBridge(DynamicBridge* db) if (!supportsDynamicBinding()) throw Exception("Exchange type does not support dynamic binding"); - for (std::vector<DynamicBridge*>::iterator iter = bridgeVector.begin(); - iter != bridgeVector.end(); iter++) - (*iter)->sendReorigin(); + { + Mutex::ScopedLock l(bridgeLock); + for (std::vector<DynamicBridge*>::iterator iter = bridgeVector.begin(); + iter != bridgeVector.end(); iter++) + (*iter)->sendReorigin(); + + bridgeVector.push_back(db); + } - bridgeVector.push_back(db); FieldTable args; args.setString(qpidFedOp, fedOpReorigin); bind(Queue::shared_ptr(), string(), &args); @@ -192,6 +197,7 @@ void Exchange::registerDynamicBridge(DynamicBridge* db) void Exchange::removeDynamicBridge(DynamicBridge* db) { + Mutex::ScopedLock l(bridgeLock); for (std::vector<DynamicBridge*>::iterator iter = bridgeVector.begin(); iter != bridgeVector.end(); iter++) if (*iter == db) { @@ -206,6 +212,7 @@ void Exchange::handleHelloRequest() void Exchange::propagateFedOp(const string& routingKey, const string& tags, const string& op, const string& origin) { + Mutex::ScopedLock l(bridgeLock); string myOp(op.empty() ? fedOpBind : op); for (std::vector<DynamicBridge*>::iterator iter = bridgeVector.begin(); |
