From 6c28276dafe83bcc5cee0c0b68b5882857578c1b Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 3 Feb 2016 12:58:30 -0500 Subject: [PATCH] Use RAII idiom for lock and locking mutex in Sequence --- src/Sequence.cpp | 4 +--- src/Sequence.h | 15 +++++++++++++++ src/ondemand/ODComputeSummaryTask.cpp | 3 +-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Sequence.cpp b/src/Sequence.cpp index 1c23ba2e6..594e3a32e 100644 --- a/src/Sequence.cpp +++ b/src/Sequence.cpp @@ -1622,7 +1622,7 @@ bool Sequence::Delete(sampleCount start, sampleCount len) //TODO: add a ref-deref mechanism to SeqBlock/BlockArray so we don't have to make this a critical section. //On-demand threads iterate over the mBlocks and the GUI thread deletes them, so for now put a mutex here over //both functions, - LockDeleteUpdateMutex(); + DeleteUpdateMutexLocker locker(*this); unsigned int numBlocks = mBlock.size(); @@ -1661,7 +1661,6 @@ bool Sequence::Delete(sampleCount start, sampleCount len) mDirManager->Deref(oldFile); mNumSamples -= len; - UnlockDeleteUpdateMutex(); return ConsistencyCheck(wxT("Delete - branch one")); } @@ -1786,7 +1785,6 @@ bool Sequence::Delete(sampleCount start, sampleCount len) // Update total number of samples and do a consistency check. mNumSamples -= len; - UnlockDeleteUpdateMutex(); return ConsistencyCheck(wxT("Delete - branch two")); } diff --git a/src/Sequence.h b/src/Sequence.h index 4cee5a9af..a257869ce 100644 --- a/src/Sequence.h +++ b/src/Sequence.h @@ -194,6 +194,21 @@ class Sequence: public XMLTagHandler { void LockDeleteUpdateMutex(){mDeleteUpdateMutex.Lock();} void UnlockDeleteUpdateMutex(){mDeleteUpdateMutex.Unlock();} + // RAII idiom wrapping the functions above + struct DeleteUpdateMutexLocker { + DeleteUpdateMutexLocker(Sequence &sequence) + : mSequence(sequence) + { + mSequence.LockDeleteUpdateMutex(); + } + ~DeleteUpdateMutexLocker() + { + mSequence.UnlockDeleteUpdateMutex(); + } + private: + Sequence &mSequence; + }; + private: // diff --git a/src/ondemand/ODComputeSummaryTask.cpp b/src/ondemand/ODComputeSummaryTask.cpp index 0c10d99eb..1d818fb03 100644 --- a/src/ondemand/ODComputeSummaryTask.cpp +++ b/src/ondemand/ODComputeSummaryTask.cpp @@ -190,7 +190,7 @@ void ODComputeSummaryTask::Update() seq = clip->GetSequence(); //This lock may be way too big since the whole file is one sequence. //TODO: test for large files and find a way to break it down. - seq->LockDeleteUpdateMutex(); + Sequence::DeleteUpdateMutexLocker locker(*seq); //See Sequence::Delete() for why need this for now.. //We don't need the mBlockFilesMutex here because it is only for the vector list. @@ -223,7 +223,6 @@ void ODComputeSummaryTask::Update() tempBlocks.insert(tempBlocks.begin() + insertCursor++, odpcmaFile); } } - seq->UnlockDeleteUpdateMutex(); node = node->GetNext(); } }