From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- dom/indexedDB/FileInfoImpl.h | 151 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 dom/indexedDB/FileInfoImpl.h (limited to 'dom/indexedDB/FileInfoImpl.h') diff --git a/dom/indexedDB/FileInfoImpl.h b/dom/indexedDB/FileInfoImpl.h new file mode 100644 index 0000000000..b7ffa3be8c --- /dev/null +++ b/dom/indexedDB/FileInfoImpl.h @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef DOM_INDEXEDDB_FILEINFOIMPL_H_ +#define DOM_INDEXEDDB_FILEINFOIMPL_H_ + +#include "FileInfo.h" + +#include "mozilla/dom/QMResult.h" +#include "mozilla/dom/quota/QuotaCommon.h" +#include "mozilla/dom/quota/ResultExtensions.h" +#include "mozilla/Mutex.h" +#include "nsIFile.h" + +namespace mozilla::dom::indexedDB { + +template +FileInfo::FileInfo( + const typename FileManager::FileInfoManagerGuard& aGuard, + SafeRefPtr aFileManager, const int64_t aFileId, + const nsrefcnt aInitialDBRefCnt) + : FileInfoBase{aFileId}, + mDBRefCnt(aInitialDBRefCnt), + mFileManager(std::move(aFileManager)) { + MOZ_ASSERT(mFileManager); +} + +template +void FileInfo::AddRef() { + AutoLockType lock(FileManager::Mutex()); + + LockedAddRef(); +} + +template +void FileInfo::Release(const bool aSyncDeleteFile) { + UpdateReferences(mRefCnt, -1, aSyncDeleteFile); +} + +template +void FileInfo::UpdateDBRefs(int32_t aDelta) { + UpdateReferences(mDBRefCnt, aDelta); +} + +template +void FileInfo::GetReferences(int32_t* const aRefCnt, + int32_t* const aDBRefCnt) { + AutoLockType lock(FileManager::Mutex()); + + if (aRefCnt) { + *aRefCnt = mRefCnt; + } + + if (aDBRefCnt) { + *aDBRefCnt = mDBRefCnt; + } +} + +template +FileManager& FileInfo::Manager() const { + return *mFileManager; +} + +template +void FileInfo::UpdateReferences(ThreadSafeAutoRefCnt& aRefCount, + const int32_t aDelta, + const bool aSyncDeleteFile) { + bool needsCleanup; + { + AutoLockType lock(FileManager::Mutex()); + + aRefCount = aRefCount + aDelta; + + if (mRefCnt + mDBRefCnt > 0) { + return; + } + + mFileManager->RemoveFileInfo(Id(), lock); + + // If the FileManager was already invalidated, we don't need to do any + // cleanup anymore. In that case, the entire origin directory has already + // been deleted by the quota manager, and we don't need to delete individual + // files. + needsCleanup = !mFileManager->Invalidated(); + } + + if (needsCleanup) { + if (aSyncDeleteFile) { + QM_WARNONLY_TRY(QM_TO_RESULT(mFileManager->SyncDeleteFile(Id()))); + } else { + Cleanup(); + } + } + + delete this; +} + +template +void FileInfo::LockedAddRef() { + FileManager::Mutex().AssertCurrentThreadOwns(); + + ++mRefCnt; +} + +template +bool FileInfo::LockedClearDBRefs( + const typename FileManager::FileInfoManagerGuard&) { + FileManager::Mutex().AssertCurrentThreadOwns(); + + mDBRefCnt = 0; + + if (mRefCnt) { + return true; + } + + // In this case, we are not responsible for removing the FileInfo from the + // hashtable. It's up to FileManager which is the only caller of this method. + + MOZ_ASSERT(mFileManager->Invalidated()); + + delete this; + + return false; +} + +template +void FileInfo::Cleanup() { + QM_WARNONLY_TRY(QM_TO_RESULT(mFileManager->AsyncDeleteFile(Id()))); +} + +template +nsCOMPtr FileInfo::GetFileForFileInfo() const { + const nsCOMPtr directory = Manager().GetDirectory(); + if (NS_WARN_IF(!directory)) { + return nullptr; + } + + nsCOMPtr file = FileManager::GetFileForId(directory, Id()); + if (NS_WARN_IF(!file)) { + return nullptr; + } + + return file; +} + +} // namespace mozilla::dom::indexedDB + +#endif // DOM_INDEXEDDB_FILEINFOIMPL_H_ -- cgit v1.2.3