From 186679b3a699092fbb64b38b12b2399517235427 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 2 Aug 2016 22:07:20 -0400 Subject: [PATCH] RAII for locking the all-projects mutex --- src/AudacityApp.cpp | 3 --- src/Project.cpp | 35 +++++++++-------------------------- src/Project.h | 10 ++++------ src/ondemand/ODManager.cpp | 3 +-- src/ondemand/ODTask.cpp | 6 ++---- 5 files changed, 16 insertions(+), 41 deletions(-) diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index ac839a250..ff2d2d8c8 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -316,9 +316,6 @@ void QuitAudacity(bool bForce) //temporarilly commented out till it is added to all projects //delete Profiler::Instance(); - //DELETE the static lock for audacity projects - AudacityProject::DeleteAllProjectsDeleteLock(); - //remove our logger std::unique_ptr{ wxLog::SetActiveTarget(NULL) }; // DELETE diff --git a/src/Project.cpp b/src/Project.cpp index 23185edc4..f5ee51616 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -173,7 +173,11 @@ std::unique_ptr AudacityProject::msClipboard{ safenew TrackList() }; double AudacityProject::msClipT0 = 0.0; double AudacityProject::msClipT1 = 0.0; AudacityProject *AudacityProject::msClipProject = NULL; -ODLock *AudacityProject::msAllProjectDeleteMutex = new ODLock(); +ODLock &AudacityProject::AllProjectDeleteMutex() +{ + static ODLock theMutex; + return theMutex; +}; #if defined(__WXMAC__) const int sbarSpaceWidth = 15; @@ -2054,18 +2058,6 @@ void AudacityProject::OnTrackListUpdated(wxCommandEvent & event) event.Skip(); } -///Prevents deletion of projects from outside threads. -void AudacityProject::AllProjectsDeleteLock() -{ - msAllProjectDeleteMutex->Lock(); -} - -///Reallows deletion of projects from outside threads. -void AudacityProject::AllProjectsDeleteUnlock() -{ - msAllProjectDeleteMutex->Unlock(); -} - ///Handles the redrawing necessary for tasks as they partially update in the background. void AudacityProject::OnODTaskUpdate(wxCommandEvent & WXUNUSED(event)) { @@ -2454,9 +2446,10 @@ void AudacityProject::OnCloseWindow(wxCloseEvent & event) // have been deleted before this. mDirManager->Deref(); - AllProjectsDeleteLock(); - gAudacityProjects.Remove(this); - AllProjectsDeleteUnlock(); + { + ODLocker locker{ &AudacityProject::AllProjectDeleteMutex() }; + gAudacityProjects.Remove(this); + } if (gActiveProject == this) { // Find a NEW active project @@ -4283,16 +4276,6 @@ void AudacityProject::DeleteClipboard() msClipboard.reset(); } -//static -void AudacityProject::DeleteAllProjectsDeleteLock() -{ - if(msAllProjectDeleteMutex) - { - delete msAllProjectDeleteMutex; - msAllProjectDeleteMutex=NULL; - } -} - void AudacityProject::ClearClipboard() { msClipT0 = 0.0; diff --git a/src/Project.h b/src/Project.h index 94ef2b4c9..4d430f694 100644 --- a/src/Project.h +++ b/src/Project.h @@ -339,7 +339,6 @@ class AUDACITY_DLL_API AudacityProject final : public wxFrame, // Other commands static TrackList *GetClipboardTracks(); static void DeleteClipboard(); - static void DeleteAllProjectsDeleteLock(); // checkActive is a temporary hack that should be removed as soon as we // get multiple effect preview working @@ -514,10 +513,6 @@ public: bool TryToMakeActionAllowed ( CommandFlag & flags, CommandFlag flagsRqd, CommandFlag mask ); - ///Prevents DELETE from external thread - for e.g. use of GetActiveProject - static void AllProjectsDeleteLock(); - static void AllProjectsDeleteUnlock(); - void PushState(const wxString &desc, const wxString &shortDesc); // use UndoPush::AUTOSAVE void PushState(const wxString &desc, const wxString &shortDesc, UndoPush flags); void RollbackState(); @@ -577,9 +572,12 @@ public: static double msClipT0; static double msClipT1; +public: + ///Prevents DELETE from external thread - for e.g. use of GetActiveProject //shared by all projects - static ODLock *msAllProjectDeleteMutex; + static ODLock &AllProjectDeleteMutex(); +private: // History/Undo manager std::unique_ptr mUndoManager; bool mDirty{ false }; diff --git a/src/ondemand/ODManager.cpp b/src/ondemand/ODManager.cpp index 2c9c00fd2..92c4bfedd 100644 --- a/src/ondemand/ODManager.cpp +++ b/src/ondemand/ODManager.cpp @@ -295,11 +295,10 @@ void ODManager::Start() { mNeedsDraw=0; wxCommandEvent event( EVT_ODTASK_UPDATE ); - AudacityProject::AllProjectsDeleteLock(); + ODLocker locker{ &AudacityProject::AllProjectDeleteMutex() }; AudacityProject* proj = GetActiveProject(); if(proj) proj->GetEventHandler()->AddPendingEvent(event); - AudacityProject::AllProjectsDeleteUnlock(); } mTerminateMutex.Lock(); } diff --git a/src/ondemand/ODTask.cpp b/src/ondemand/ODTask.cpp index 19186453c..93b5e5f84 100644 --- a/src/ondemand/ODTask.cpp +++ b/src/ondemand/ODTask.cpp @@ -128,7 +128,7 @@ void ODTask::DoSome(float amountWork) ODManager::Instance()->AddTask(this); //we did a bit of progress - we should allow a resave. - AudacityProject::AllProjectsDeleteLock(); + ODLocker locker{ &AudacityProject::AllProjectDeleteMutex() }; for(unsigned i=0; i