зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1617132 - Make FileInfo non-polymorphic and merge with its templated subclass. r=dom-workers-and-storage-reviewers,janv
Differential Revision: https://phabricator.services.mozilla.com/D63627 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
73def07011
Коммит
ec85b918d5
|
@ -16109,18 +16109,17 @@ nsresult FileManager::Init(nsIFile* aDirectory,
|
|||
return rv;
|
||||
}
|
||||
|
||||
int32_t refcount;
|
||||
rv = stmt->GetInt32(1, &refcount);
|
||||
int32_t dbRefCnt;
|
||||
rv = stmt->GetInt32(1, &dbRefCnt);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(refcount > 0);
|
||||
|
||||
RefPtr<FileInfo> fileInfo = FileInfo::Create(this, id);
|
||||
fileInfo->mDBRefCnt = static_cast<nsrefcnt>(refcount);
|
||||
|
||||
mFileInfos.Put(id, fileInfo);
|
||||
// We put a raw pointer into the hash table, so the memory refcount will be
|
||||
// 0, but the dbRefCnt is non-zero, which will keep the FileInfo object
|
||||
// alive.
|
||||
MOZ_ASSERT(dbRefCnt > 0);
|
||||
mFileInfos.Put(id, new FileInfo(this, id, static_cast<nsrefcnt>(dbRefCnt)));
|
||||
|
||||
mLastFileId = std::max(id, mLastFileId);
|
||||
}
|
||||
|
@ -16245,7 +16244,7 @@ RefPtr<FileInfo> FileManager::GetNewFileInfo() {
|
|||
|
||||
int64_t id = mLastFileId + 1;
|
||||
|
||||
fileInfo = FileInfo::Create(this, id);
|
||||
fileInfo = new FileInfo(this, id);
|
||||
|
||||
mFileInfos.Put(id, fileInfo);
|
||||
|
||||
|
|
|
@ -24,47 +24,6 @@ namespace indexedDB {
|
|||
using namespace mozilla::dom::quota;
|
||||
using namespace mozilla::ipc;
|
||||
|
||||
namespace {
|
||||
|
||||
template <typename IdType>
|
||||
class FileInfoImpl final : public FileInfo {
|
||||
IdType mFileId;
|
||||
|
||||
public:
|
||||
FileInfoImpl(FileManager* aFileManager, IdType aFileId)
|
||||
: FileInfo(aFileManager), mFileId(aFileId) {
|
||||
MOZ_ASSERT(aFileManager);
|
||||
MOZ_ASSERT(aFileId > 0);
|
||||
}
|
||||
|
||||
private:
|
||||
~FileInfoImpl() = default;
|
||||
|
||||
virtual int64_t Id() const override { return int64_t(mFileId); }
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
FileInfo::FileInfo(FileManager* aFileManager) : mFileManager(aFileManager) {
|
||||
MOZ_ASSERT(aFileManager);
|
||||
}
|
||||
|
||||
// static
|
||||
FileInfo* FileInfo::Create(FileManager* aFileManager, int64_t aId) {
|
||||
MOZ_ASSERT(aFileManager);
|
||||
MOZ_ASSERT(aId > 0);
|
||||
|
||||
if (aId <= INT16_MAX) {
|
||||
return new FileInfoImpl<int16_t>(aFileManager, aId);
|
||||
}
|
||||
|
||||
if (aId <= INT32_MAX) {
|
||||
return new FileInfoImpl<int32_t>(aFileManager, aId);
|
||||
}
|
||||
|
||||
return new FileInfoImpl<int64_t>(aFileManager, aId);
|
||||
}
|
||||
|
||||
void FileInfo::GetReferences(int32_t* aRefCnt, int32_t* aDBRefCnt,
|
||||
int32_t* aSliceRefCnt) {
|
||||
MOZ_ASSERT(!IndexedDatabaseManager::IsClosed());
|
||||
|
|
|
@ -15,21 +15,28 @@ namespace indexedDB {
|
|||
|
||||
class FileManager;
|
||||
|
||||
class FileInfo {
|
||||
class FileInfo final {
|
||||
friend class FileManager;
|
||||
|
||||
const int64_t mFileId;
|
||||
|
||||
ThreadSafeAutoRefCnt mRefCnt;
|
||||
ThreadSafeAutoRefCnt mDBRefCnt;
|
||||
ThreadSafeAutoRefCnt mSliceRefCnt;
|
||||
|
||||
RefPtr<FileManager> mFileManager;
|
||||
const RefPtr<FileManager> mFileManager;
|
||||
|
||||
public:
|
||||
class CustomCleanupCallback;
|
||||
|
||||
static FileInfo* Create(FileManager* aFileManager, int64_t aId);
|
||||
|
||||
explicit FileInfo(FileManager* aFileManager);
|
||||
FileInfo(RefPtr<FileManager> aFileManager, const int64_t aFileId,
|
||||
const nsrefcnt aInitialDBRefCnt = 0)
|
||||
: mFileId(aFileId),
|
||||
mDBRefCnt(aInitialDBRefCnt),
|
||||
mFileManager(std::move(aFileManager)) {
|
||||
MOZ_ASSERT(mFileManager);
|
||||
MOZ_ASSERT(mFileId > 0);
|
||||
}
|
||||
|
||||
void AddRef() { UpdateReferences(mRefCnt, 1); }
|
||||
|
||||
|
@ -48,13 +55,10 @@ class FileInfo {
|
|||
|
||||
FileManager* Manager() const { return mFileManager; }
|
||||
|
||||
virtual int64_t Id() const = 0;
|
||||
int64_t Id() const { return mFileId; }
|
||||
|
||||
static nsCOMPtr<nsIFile> GetFileForFileInfo(FileInfo* aFileInfo);
|
||||
|
||||
protected:
|
||||
virtual ~FileInfo() = default;
|
||||
|
||||
private:
|
||||
void UpdateReferences(
|
||||
ThreadSafeAutoRefCnt& aRefCount, int32_t aDelta,
|
||||
|
|
Загрузка…
Ссылка в новой задаче