diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-17 09:03:13 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-17 09:03:13 +0000 |
commit | 0681b3ac9a6ab4879ca2fbfcf8aa9d00a67b8365 (patch) | |
tree | 1437375a1c16af40bb2982577c25eb9608e17566 /netwerk/cache2 | |
parent | Adding debian version 115.11.0esr-1~deb12u1. (diff) | |
download | firefox-esr-0681b3ac9a6ab4879ca2fbfcf8aa9d00a67b8365.tar.xz firefox-esr-0681b3ac9a6ab4879ca2fbfcf8aa9d00a67b8365.zip |
Merging upstream version 115.12.0esr.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'netwerk/cache2')
-rw-r--r-- | netwerk/cache2/CacheFileIOManager.cpp | 44 | ||||
-rw-r--r-- | netwerk/cache2/CacheFileIOManager.h | 8 | ||||
-rw-r--r-- | netwerk/cache2/CacheFileMetadata.cpp | 6 | ||||
-rw-r--r-- | netwerk/cache2/CacheIndex.cpp | 14 |
4 files changed, 48 insertions, 24 deletions
diff --git a/netwerk/cache2/CacheFileIOManager.cpp b/netwerk/cache2/CacheFileIOManager.cpp index 41c775ff68..846854ebe7 100644 --- a/netwerk/cache2/CacheFileIOManager.cpp +++ b/netwerk/cache2/CacheFileIOManager.cpp @@ -1962,26 +1962,46 @@ nsresult CacheFileIOManager::Write(CacheFileHandle* aHandle, int64_t aOffset, "validate=%d, truncate=%d, listener=%p]", aHandle, aOffset, aCount, aValidate, aTruncate, aCallback)); - nsresult rv; + MOZ_ASSERT(aCallback); + RefPtr<CacheFileIOManager> ioMan = gInstance; - if (aHandle->IsClosed() || (aCallback && aCallback->IsKilled()) || !ioMan) { - if (!aCallback) { - // When no callback is provided, CacheFileIOManager is responsible for - // releasing the buffer. We must release it even in case of failure. - free(const_cast<char*>(aBuf)); - } + if (aHandle->IsClosed() || aCallback->IsKilled() || !ioMan) { return NS_ERROR_NOT_INITIALIZED; } RefPtr<WriteEvent> ev = new WriteEvent(aHandle, aOffset, aBuf, aCount, aValidate, aTruncate, aCallback); - rv = ioMan->mIOThread->Dispatch(ev, aHandle->mPriority - ? CacheIOThread::WRITE_PRIORITY - : CacheIOThread::WRITE); - NS_ENSURE_SUCCESS(rv, rv); + return ioMan->mIOThread->Dispatch(ev, aHandle->mPriority + ? CacheIOThread::WRITE_PRIORITY + : CacheIOThread::WRITE); +} - return NS_OK; +// static +nsresult CacheFileIOManager::WriteWithoutCallback(CacheFileHandle* aHandle, + int64_t aOffset, char* aBuf, + int32_t aCount, + bool aValidate, + bool aTruncate) { + LOG(("CacheFileIOManager::WriteWithoutCallback() [handle=%p, offset=%" PRId64 + ", count=%d, " + "validate=%d, truncate=%d]", + aHandle, aOffset, aCount, aValidate, aTruncate)); + + RefPtr<CacheFileIOManager> ioMan = gInstance; + + if (aHandle->IsClosed() || !ioMan) { + // When no callback is provided, CacheFileIOManager is responsible for + // releasing the buffer. We must release it even in case of failure. + free(aBuf); + return NS_ERROR_NOT_INITIALIZED; + } + + RefPtr<WriteEvent> ev = new WriteEvent(aHandle, aOffset, aBuf, aCount, + aValidate, aTruncate, nullptr); + return ioMan->mIOThread->Dispatch(ev, aHandle->mPriority + ? CacheIOThread::WRITE_PRIORITY + : CacheIOThread::WRITE); } static nsresult TruncFile(PRFileDesc* aFD, int64_t aEOF) { diff --git a/netwerk/cache2/CacheFileIOManager.h b/netwerk/cache2/CacheFileIOManager.h index 62533fb668..20a4b8f2c1 100644 --- a/netwerk/cache2/CacheFileIOManager.h +++ b/netwerk/cache2/CacheFileIOManager.h @@ -286,9 +286,17 @@ class CacheFileIOManager final : public nsITimerCallback, public nsINamed { CacheFileIOListener* aCallback); static nsresult Read(CacheFileHandle* aHandle, int64_t aOffset, char* aBuf, int32_t aCount, CacheFileIOListener* aCallback); + // This function must be called with a callback. The caller is responsible for + // releasing |aBuf|. static nsresult Write(CacheFileHandle* aHandle, int64_t aOffset, const char* aBuf, int32_t aCount, bool aValidate, bool aTruncate, CacheFileIOListener* aCallback); + // Similar to the above, but without the callback. Note that |aBuf| will be + // released by CacheFileIOManager. + static nsresult WriteWithoutCallback(CacheFileHandle* aHandle, + int64_t aOffset, char* aBuf, + int32_t aCount, bool aValidate, + bool aTruncate); // PinningDoomRestriction: // NO_RESTRICTION // no restriction is checked, the file is simply always doomed diff --git a/netwerk/cache2/CacheFileMetadata.cpp b/netwerk/cache2/CacheFileMetadata.cpp index 68d55b1988..5e299a7852 100644 --- a/netwerk/cache2/CacheFileMetadata.cpp +++ b/netwerk/cache2/CacheFileMetadata.cpp @@ -257,14 +257,16 @@ nsresult CacheFileMetadata::WriteMetadata( char* writeBuffer = mWriteBuf; if (aListener) { mListener = aListener; + rv = CacheFileIOManager::Write(mHandle, aOffset, writeBuffer, + p - writeBuffer, true, true, this); } else { // We are not going to pass |this| as a callback so the buffer will be // released by CacheFileIOManager. Just null out mWriteBuf here. mWriteBuf = nullptr; + rv = CacheFileIOManager::WriteWithoutCallback(mHandle, aOffset, writeBuffer, + p - writeBuffer, true, true); } - rv = CacheFileIOManager::Write(mHandle, aOffset, writeBuffer, p - writeBuffer, - true, true, aListener ? this : nullptr); if (NS_FAILED(rv)) { LOG( ("CacheFileMetadata::WriteMetadata() - CacheFileIOManager::Write() " diff --git a/netwerk/cache2/CacheIndex.cpp b/netwerk/cache2/CacheIndex.cpp index c0cb63ef6d..34931087c0 100644 --- a/netwerk/cache2/CacheIndex.cpp +++ b/netwerk/cache2/CacheIndex.cpp @@ -2213,16 +2213,10 @@ void CacheIndex::ParseRecords(const StaticMutexAutoLock& aProofOfLock) { reinterpret_cast<uint32_t*>(moz_xmalloc(sizeof(uint32_t))); NetworkEndian::writeUint32(isDirty, 1); - // Mark index dirty. The buffer is freed by CacheFileIOManager when - // nullptr is passed as the listener and the call doesn't fail - // synchronously. - rv = CacheFileIOManager::Write(mIndexHandle, 2 * sizeof(uint32_t), - reinterpret_cast<char*>(isDirty), - sizeof(uint32_t), true, false, nullptr); - if (NS_FAILED(rv)) { - // This is not fatal, just free the memory - free(isDirty); - } + // Mark index dirty. The buffer will be freed by CacheFileIOManager. + CacheFileIOManager::WriteWithoutCallback( + mIndexHandle, 2 * sizeof(uint32_t), reinterpret_cast<char*>(isDirty), + sizeof(uint32_t), true, false); } pos += sizeof(uint32_t); |