From 88dba87fa983ba0ab1305defff5d7517eadb0667 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Apr 2013 14:17:06 -0700 Subject: [PATCH] Fix the deadlock. Can't hold the LedgerMaster lock when calling a pub* function. --- src/cpp/ripple/LedgerMaster.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index a9471493a..25184f1c4 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -122,10 +122,13 @@ Ledger::pointer LedgerMaster::closeLedger(bool recover) TER LedgerMaster::doTransaction(SerializedTransaction::ref txn, TransactionEngineParams params, bool& didApply) { - boost::recursive_mutex::scoped_lock sl(mLock); - TER result = mEngine.applyTransaction(*txn, params, didApply); + { + boost::recursive_mutex::scoped_lock sl(mLock); + TER result = mEngine.applyTransaction(*txn, params, didApply); + Ledger::pointer ledger = mEngine.getLedger(); + } // if (didApply) - theApp->getOPs().pubProposedTransaction(mEngine.getLedger(), txn, result); + theApp->getOPs().pubProposedTransaction(ledger, txn, result); return result; }