diff --git a/Framework/Kernel/src/DiskBuffer.cpp b/Framework/Kernel/src/DiskBuffer.cpp index ec910adb4dd79b141b7e61042f97e5a4b168abea..2eb5cbe25a325968ca51f9ce8c3623270e8a0d37 100644 --- a/Framework/Kernel/src/DiskBuffer.cpp +++ b/Framework/Kernel/src/DiskBuffer.cpp @@ -52,19 +52,18 @@ void DiskBuffer::toWrite(ISaveable *item) { // its size in memory { // forget old memory size - m_mutex.lock(); + Kernel::UniqueLockMutex uniqueLock(m_mutex); m_writeBufferUsed -= item->getBufferSize(); // add new size size_t newMemorySize = item->getDataMemorySize(); m_writeBufferUsed += newMemorySize; - m_mutex.unlock(); + uniqueLock.unlock(); item->setBufferSize(newMemorySize); } else { - m_mutex.lock(); + Kernel::LockGuardMutex lock(m_mutex); m_toWriteBuffer.push_front(item); m_writeBufferUsed += item->setBufferPosition(m_toWriteBuffer.begin()); m_nObjectsToWrite++; - m_mutex.unlock(); } // Should we now write out the old data? @@ -84,19 +83,18 @@ void DiskBuffer::objectDeleted(ISaveable *item) { if (item == nullptr) return; // have it ever been in the buffer? - m_mutex.lock(); + Kernel::UniqueLockMutex uniqueLock(m_mutex); auto opt2it = item->getBufPostion(); if (opt2it) { m_writeBufferUsed -= item->getBufferSize(); m_toWriteBuffer.erase(*opt2it); } else { - m_mutex.unlock(); return; } // indicate to the object that it is not stored in memory any more item->clearBufferState(); - m_mutex.unlock(); + uniqueLock.unlock(); // Mark the amount of space used on disk as free if (item->wasSaved()) @@ -109,7 +107,7 @@ void DiskBuffer::objectDeleted(ISaveable *item) { */ void DiskBuffer::writeOldObjects() { - Poco::ScopedLock<Kernel::Mutex> _lock(m_mutex); + Kernel::LockGuardMutex _lock(m_mutex); // Holder for any objects that you were NOT able to write. std::list<ISaveable *> couldNotWrite; size_t objectsNotWritten(0); @@ -208,7 +206,7 @@ void DiskBuffer::flushCache() { void DiskBuffer::freeBlock(uint64_t const pos, uint64_t const size) { if (size == 0 || size == std::numeric_limits<uint64_t>::max()) return; - m_freeMutex.lock(); + Kernel::LockGuardMutex lock(m_freeMutex); // Make the block FreeBlock newBlock(pos, size); @@ -219,7 +217,6 @@ void DiskBuffer::freeBlock(uint64_t const pos, uint64_t const size) { // Or, if the map has only 1 item then it cannot do any merging. This solves a // hanging bug in MacOS. Refs #3652 if (!p.second || m_free.size() <= 1) { - m_freeMutex.unlock(); return; } @@ -254,8 +251,6 @@ void DiskBuffer::freeBlock(uint64_t const pos, uint64_t const size) { m_free.erase(it_after); } } - - m_freeMutex.unlock(); } //--------------------------------------------------------------------------------------------- @@ -264,7 +259,7 @@ void DiskBuffer::freeBlock(uint64_t const pos, uint64_t const size) { * automatically defrags neighboring blocks. */ void DiskBuffer::defragFreeBlocks() { - m_freeMutex.lock(); + Kernel::LockGuardMutex lock(m_freeMutex); freeSpace_t::iterator it = m_free.begin(); FreeBlock thisBlock; @@ -289,7 +284,6 @@ void DiskBuffer::defragFreeBlocks() { thisBlock = *it; } } - m_freeMutex.unlock(); } //--------------------------------------------------------------------------------------------- @@ -300,7 +294,7 @@ void DiskBuffer::defragFreeBlocks() { * @return a new position at which the data can be saved. */ uint64_t DiskBuffer::allocate(uint64_t const newSize) { - m_freeMutex.lock(); + Kernel::UniqueLockMutex uniqueLock(m_freeMutex); // Now, find the first available block of sufficient size. freeSpace_bySize_t::iterator it; @@ -318,7 +312,6 @@ uint64_t DiskBuffer::allocate(uint64_t const newSize) { // And we assume the file will grow by this much. m_fileLength += newSize; // Will place the new block at the end of the file - m_freeMutex.unlock(); return retVal; } else { // std::cout << "Block found for allocate " << newSize << std::endl; @@ -326,7 +319,7 @@ uint64_t DiskBuffer::allocate(uint64_t const newSize) { uint64_t foundSize = it->getSize(); // Remove the free block you found - it is no longer free m_free_bySize.erase(it); - m_freeMutex.unlock(); + uniqueLock.unlock(); // Block was too large - free the bit of space after it. if (foundSize > newSize) { this->freeBlock(foundPos + newSize, foundSize - newSize); diff --git a/Framework/Kernel/test/DiskBufferTest.h b/Framework/Kernel/test/DiskBufferTest.h index 82a451b6ffc6870fd1b7fc13948048a69d833e0f..e3aa194b42a7c495bfb48e69fa38398a0a0c2b50 100644 --- a/Framework/Kernel/test/DiskBufferTest.h +++ b/Framework/Kernel/test/DiskBufferTest.h @@ -736,7 +736,7 @@ public: /// Fake a seek followed by a write static void fakeSeekAndWrite(uint64_t newPos) { - streamMutex.lock(); + Kernel::LockGuardMutex lock(streamMutex); int64_t seek = int64_t(filePos) - int64_t(newPos); if (seek < 0) seek = -seek; @@ -748,7 +748,6 @@ public: while (tim.elapsed_no_reset() < seekTime) { /*Wait*/ } filePos = newPos; - streamMutex.unlock(); } virtual void load() { if (this->wasSaved() && !this->isLoaded()) {