From 9b32fc7a2b97faef5856581688b478c1c3298dac Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 13 May 2019 21:17:41 -0400 Subject: [PATCH] DirManager.cpp doesn't depend on Clipboard... ... Locate other outstanding DirManagers by other means, a global tracking array. This does not yet break any dependency cycles. --- src/Benchmark.cpp | 2 +- src/DirManager.cpp | 46 ++++++++++++++++++++++++++++++++++------------ src/DirManager.h | 6 ++++++ src/Project.cpp | 5 ++--- 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/Benchmark.cpp b/src/Benchmark.cpp index 4a6c3e5f1..2ac45f94b 100644 --- a/src/Benchmark.cpp +++ b/src/Benchmark.cpp @@ -359,7 +359,7 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) HoldPrint(true); ZoomInfo zoomInfo(0.0, ZoomInfo::GetDefaultZoom()); - auto dd = std::make_shared(); + auto dd = DirManager::Create(); const auto t = TrackFactory{ dd, &zoomInfo }.NewWaveTrack(int16Sample); t->SetRate(1); diff --git a/src/DirManager.cpp b/src/DirManager.cpp index df5a8a3b7..818dc82e7 100644 --- a/src/DirManager.cpp +++ b/src/DirManager.cpp @@ -85,7 +85,6 @@ #include #endif -#include "Clipboard.h" #include "FileNames.h" #include "blockfile/LegacyBlockFile.h" #include "blockfile/LegacyAliasBlockFile.h" @@ -356,6 +355,19 @@ wxString DirManager::globaltemp; int DirManager::numDirManagers = 0; bool DirManager::dontDeleteTempFiles = false; +namespace { + +// Global tracking of all outstanding DirManagers +std::vector< std::weak_ptr< DirManager > > sDirManagers; + +} + +std::shared_ptr DirManager::Create() +{ + auto result = std::shared_ptr< DirManager >( safenew DirManager ); + sDirManagers.push_back( result ); + return result; +} DirManager::DirManager() { @@ -410,6 +422,13 @@ DirManager::DirManager() DirManager::~DirManager() { + auto start = sDirManagers.begin(), finish = sDirManagers.end(), + iter = std::remove_if( start, finish, + [=]( const std::weak_ptr &ptr ){ + return ptr.expired() || ptr.lock().get() == this; + } ); + sDirManagers.erase( iter, finish ); + numDirManagers--; if (numDirManagers == 0) { CleanTempDir(); @@ -1744,7 +1763,12 @@ void DirManager::FindOrphanBlockFiles( const FilePaths &filePathArray, // input: all files in project directory FilePaths &orphanFilePathArray) // output: orphan files { - DirManager *clipboardDM = NULL; + std::vector< std::shared_ptr > otherDirManagers; + for ( auto &wPtr : sDirManagers ) { + auto sPtr = wPtr.lock(); + if ( sPtr && sPtr.get() != this ) + otherDirManagers.push_back( sPtr ); + } for (size_t i = 0; i < filePathArray.size(); i++) { @@ -1757,17 +1781,15 @@ void DirManager::FindOrphanBlockFiles( (ext.IsSameAs(wxT("au"), false) || ext.IsSameAs(wxT("auf"), false))) { - if (!clipboardDM) { - auto &clipTracks = Clipboard::Get().GetTracks(); - - auto track = *clipTracks.Any().first; - if (track) - clipboardDM = track->GetDirManager().get(); - } - // Ignore it if it exists in the clipboard (from a previously closed project) - if (!(clipboardDM && clipboardDM->ContainsBlockFile(basename))) - orphanFilePathArray.push_back(fullname.GetFullPath()); + if ( std::any_of( otherDirManagers.begin(), otherDirManagers.end(), + [&]( const std::shared_ptr< DirManager > &ptr ){ + return ptr->ContainsBlockFile( basename ); + } + ) ) + continue; + + orphanFilePathArray.push_back(fullname.GetFullPath()); } } for ( const auto &orphan : orphanFilePathArray ) diff --git a/src/DirManager.h b/src/DirManager.h index 71d30576d..ed733384a 100644 --- a/src/DirManager.h +++ b/src/DirManager.h @@ -67,9 +67,15 @@ class PROFILE_DLL_API DirManager final : public XMLTagHandler { static void RecursivelyRemove(const FilePaths& filePathArray, int count, int bias, int flags, const wxChar* message = nullptr); + private: // MM: Construct DirManager + // Don't call this directly but use Create() instead DirManager(); + public: + + static std::shared_ptr< DirManager > Create(); + virtual ~DirManager(); size_t NumBlockFiles() const { return mBlockFileHash.size(); } diff --git a/src/Project.cpp b/src/Project.cpp index 79a2cfe0e..c43ad8a08 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -1130,8 +1130,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, MissingAliasFilesDialog::SetShouldShow(true); // MM: DirManager is created dynamically, freed on demand via ref-counting - // MM: We don't need to Ref() here because it start with refcount=1 - mDirManager = std::make_shared(); + mDirManager = DirManager::Create(); mLastSavedTracks.reset(); @@ -5371,7 +5370,7 @@ void AudacityProject::ResetProjectToEmpty() { SelectActions::DoSelectAll(*this); TrackActions::DoRemoveTracks(*this); // A new DirManager. - mDirManager = std::make_shared(); + mDirManager = DirManager::Create(); mTrackFactory.reset(safenew TrackFactory{ mDirManager, &mViewInfo }); // mLastSavedTrack code copied from OnCloseWindow.