From 9f5b58c8ab841e05f372394ca2f69fd13af11e02 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 9 Feb 2016 15:14:43 -0500 Subject: [PATCH] Fix short_read test race/deadlock --- src/ripple/overlay/tests/short_read.test.cpp | 26 ++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/ripple/overlay/tests/short_read.test.cpp b/src/ripple/overlay/tests/short_read.test.cpp index a66a16d1a..5949e661d 100644 --- a/src/ripple/overlay/tests/short_read.test.cpp +++ b/src/ripple/overlay/tests/short_read.test.cpp @@ -140,13 +140,25 @@ private: void close() { - std::unique_lock lock(mutex_); - if (closed_) - return; - closed_ = true; - for(auto& c : list_) - if(auto p = c.second.lock()) - p->close(); + std::vector> v; + { + std::unique_lock lock(mutex_); + v.reserve(list_.size()); + if (closed_) + return; + closed_ = true; + for(auto const& c : list_) + { + if(auto p = c.second.lock()) + { + p->close(); + // Must destroy shared_ptr outside the + // lock otherwise deadlock from the + // managed object's destructor. + v.emplace_back(std::move(p)); + } + } + } } void