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:
Simon Giesecke 2020-02-21 11:22:02 +00:00
Родитель 73def07011
Коммит ec85b918d5
3 изменённых файлов: 21 добавлений и 59 удалений

Просмотреть файл

@ -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,