From bade087b4e0e363b221e7d04c7730c128674b10d Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 17 Apr 2013 13:06:41 -0700 Subject: [PATCH] Fix a deadlock reported by cn_smi between the PeerSet lock and the master lock. --- src/cpp/ripple/LedgerAcquire.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 90674d6e0..a54fc5f6d 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -252,6 +252,15 @@ boost::weak_ptr LedgerAcquire::pmDowncast() return boost::shared_polymorphic_downcast(shared_from_this()); } +static void LADispatch( + Job& job, + LedgerAcquire::pointer la, + std::vector< FUNCTION_TYPE > trig) +{ + for (unsigned int i = 0; i < trig.size(); ++i) + trig[i](la); +} + void LedgerAcquire::done() { if (mSignaled) @@ -282,9 +291,9 @@ void LedgerAcquire::done() else theApp->getMasterLedgerAcquire().logFailure(mHash); - // FIXME: We hold the PeerSet lock - for (unsigned int i = 0; i < triggers.size(); ++i) - triggers[i](shared_from_this()); + if (!triggers.empty()) // We hold the PeerSet lock, so must dispatch + theApp->getJobQueue().addJob(jtLEDGER_DATA, "triggers", + BIND_TYPE(LADispatch, P_1, shared_from_this(), triggers)); } bool LedgerAcquire::addOnComplete(FUNCTION_TYPE trigger)