From ddf1f0fdcc847e33cf57305a7db8eb40a1f18bbd Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 30 Jan 2003 15:06:32 +0000 Subject: [PATCH] Fixed a deadlock in free_unreachable_objects. [SVN r17090] --- src/sp_collector.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/sp_collector.cpp b/src/sp_collector.cpp index d56bf1a..7b96ed7 100644 --- a/src/sp_collector.cpp +++ b/src/sp_collector.cpp @@ -195,25 +195,27 @@ static void scan_and_free(void * area, size_t size, map2_type const & m2, free_l void free_unreachable_objects() { - map2_type m2; + free_list_type free; + + { + map2_type m2; #ifdef BOOST_HAS_THREADS - mutex_type::scoped_lock lock(get_mutex()); + mutex_type::scoped_lock lock(get_mutex()); #endif - map_type const & m = get_map(); + map_type const & m = get_map(); - find_unreachable_objects_impl(m, m2); + find_unreachable_objects_impl(m, m2); - free_list_type free; - - for(map2_type::iterator j = m2.begin(); j != m2.end(); ++j) - { - map_type::const_iterator i = m.find(j->first); - BOOST_ASSERT(i != m.end()); - scan_and_free(i->second.first, i->second.second, m2, free); + for(map2_type::iterator j = m2.begin(); j != m2.end(); ++j) + { + map_type::const_iterator i = m.find(j->first); + BOOST_ASSERT(i != m.end()); + scan_and_free(i->second.first, i->second.second, m2, free); + } } std::cout << "... about to free " << free.size() << " objects.\n";