From ae1ee28451c88243dff8bc349547600099744999 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:13:54 +0100 Subject: [PATCH] Bug 1348660 - Part 3: Separate the canceled state out of UsageInfo; r=btseng --- dom/asmjscache/AsmJSCache.cpp | 10 ++++++++-- dom/cache/QuotaClient.cpp | 20 ++++++++++++-------- dom/indexedDB/ActorsParent.cpp | 30 ++++++++++++++++++++---------- dom/quota/ActorsParent.cpp | 19 +++++++++++++------ dom/quota/Client.h | 4 ++++ dom/quota/UsageInfo.h | 23 +++-------------------- 6 files changed, 60 insertions(+), 46 deletions(-) diff --git a/dom/asmjscache/AsmJSCache.cpp b/dom/asmjscache/AsmJSCache.cpp index 3c2c959ca8f5..e8f657bff0cf 100644 --- a/dom/asmjscache/AsmJSCache.cpp +++ b/dom/asmjscache/AsmJSCache.cpp @@ -1623,18 +1623,24 @@ public: InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override { if (!aUsageInfo) { return NS_OK; } - return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aUsageInfo); + return GetUsageForOrigin(aPersistenceType, + aGroup, + aOrigin, + aCanceled, + aUsageInfo); } nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override { QuotaManager* qm = QuotaManager::Get(); @@ -1658,7 +1664,7 @@ public: bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && - hasMore && !aUsageInfo->Canceled()) { + hasMore && !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/cache/QuotaClient.cpp b/dom/cache/QuotaClient.cpp index b33fa8c34a31..5641c953c6c0 100644 --- a/dom/cache/QuotaClient.cpp +++ b/dom/cache/QuotaClient.cpp @@ -16,6 +16,7 @@ namespace { +using mozilla::Atomic; using mozilla::dom::ContentParentId; using mozilla::dom::cache::Manager; using mozilla::dom::quota::Client; @@ -25,7 +26,8 @@ using mozilla::dom::quota::UsageInfo; using mozilla::ipc::AssertIsOnBackgroundThread; static nsresult -GetBodyUsage(nsIFile* aDir, UsageInfo* aUsageInfo) +GetBodyUsage(nsIFile* aDir, const Atomic& aCanceled, + UsageInfo* aUsageInfo) { nsCOMPtr entries; nsresult rv = aDir->GetDirectoryEntries(getter_AddRefs(entries)); @@ -33,7 +35,7 @@ GetBodyUsage(nsIFile* aDir, UsageInfo* aUsageInfo) bool hasMore; while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore && - !aUsageInfo->Canceled()) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -45,7 +47,7 @@ GetBodyUsage(nsIFile* aDir, UsageInfo* aUsageInfo) if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (isDir) { - rv = GetBodyUsage(file, aUsageInfo); + rv = GetBodyUsage(file, aCanceled, aUsageInfo); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } continue; } @@ -72,7 +74,8 @@ public: virtual nsresult InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, - const nsACString& aOrigin, UsageInfo* aUsageInfo) override + const nsACString& aOrigin, const AtomicBool& aCanceled, + UsageInfo* aUsageInfo) override { // The QuotaManager passes a nullptr UsageInfo if there is no quota being // enforced against the origin. @@ -80,12 +83,13 @@ public: return NS_OK; } - return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aUsageInfo); + return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aCanceled, + aUsageInfo); } virtual nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, - const nsACString& aOrigin, + const nsACString& aOrigin, const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override { MOZ_DIAGNOSTIC_ASSERT(aUsageInfo); @@ -107,7 +111,7 @@ public: bool hasMore; while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore && - !aUsageInfo->Canceled()) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -124,7 +128,7 @@ public: if (isDir) { if (leafName.EqualsLiteral("morgue")) { - rv = GetBodyUsage(file, aUsageInfo); + rv = GetBodyUsage(file, aCanceled, aUsageInfo); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } else { NS_WARNING("Unknown Cache directory found!"); diff --git a/dom/indexedDB/ActorsParent.cpp b/dom/indexedDB/ActorsParent.cpp index d30f58e8d456..feaabc9d49f9 100644 --- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -9347,12 +9347,14 @@ public: InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override; nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override; void @@ -9394,13 +9396,14 @@ private: nsresult GetDatabaseFilenames(nsIFile* aDirectory, - UsageInfo* aUsageInfo, + const AtomicBool& aCanceled, bool aForUpgrade, nsTArray& aSubdirsToProcess, nsTHashtable& aDatabaseFilename); nsresult GetUsageForDirectoryInternal(nsIFile* aDirectory, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo, bool aDatabaseFiles); @@ -17828,10 +17831,11 @@ QuotaClient::UpgradeStorageFrom1_0To2_0(nsIFile* aDirectory) AssertIsOnIOThread(); MOZ_ASSERT(aDirectory); + AtomicBool dummy(false); AutoTArray subdirsToProcess; nsTHashtable databaseFilenames(20); nsresult rv = GetDatabaseFilenames(aDirectory, - nullptr, + /* aCanceled */ dummy, /* aForUpgrade */ true, subdirsToProcess, databaseFilenames); @@ -17924,6 +17928,7 @@ nsresult QuotaClient::InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) { AssertIsOnIOThread(); @@ -17942,7 +17947,7 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType, AutoTArray subdirsToProcess; nsTHashtable databaseFilenames(20); rv = GetDatabaseFilenames(directory, - aUsageInfo, + aCanceled, /* aForUpgrade */ false, subdirsToProcess, databaseFilenames); @@ -17974,7 +17979,9 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType, const NS_ConvertASCIItoUTF16 walSuffix(kSQLiteWALSuffix, LiteralStringLength(kSQLiteWALSuffix)); - for (auto iter = databaseFilenames.ConstIter(); !iter.Done(); iter.Next()) { + for (auto iter = databaseFilenames.ConstIter(); + !iter.Done() && !aCanceled; + iter.Next()) { auto& databaseFilename = iter.Get()->GetKey(); nsCOMPtr fmDirectory; @@ -18022,7 +18029,7 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType, return rv; } - if (aUsageInfo && !aUsageInfo->Canceled()) { + if (aUsageInfo) { int64_t fileSize; rv = databaseFile->GetFileSize(&fileSize); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -18059,6 +18066,7 @@ nsresult QuotaClient::GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) { AssertIsOnIOThread(); @@ -18071,7 +18079,7 @@ QuotaClient::GetUsageForOrigin(PersistenceType aPersistenceType, return rv; } - rv = GetUsageForDirectoryInternal(directory, aUsageInfo, true); + rv = GetUsageForDirectoryInternal(directory, aCanceled, aUsageInfo, true); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -18260,12 +18268,13 @@ QuotaClient::GetDirectory(PersistenceType aPersistenceType, nsresult QuotaClient::GetDatabaseFilenames( nsIFile* aDirectory, - UsageInfo* aUsageInfo, + const AtomicBool& aCanceled, bool aForUpgrade, nsTArray& aSubdirsToProcess, nsTHashtable& aDatabaseFilenames) { AssertIsOnIOThread(); + MOZ_ASSERT(aDirectory); nsCOMPtr entries; nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries)); @@ -18286,7 +18295,7 @@ QuotaClient::GetDatabaseFilenames( bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore && - (!aUsageInfo || !aUsageInfo->Canceled())) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -18362,6 +18371,7 @@ QuotaClient::GetDatabaseFilenames( nsresult QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo, bool aDatabaseFiles) { @@ -18388,7 +18398,7 @@ QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory, bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore && - !aUsageInfo->Canceled()) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -18423,7 +18433,7 @@ QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory, if (isDirectory) { if (aDatabaseFiles) { - rv = GetUsageForDirectoryInternal(file, aUsageInfo, false); + rv = GetUsageForDirectoryInternal(file, aCanceled, aUsageInfo, false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index 68459c1d0a3d..9a7223c33beb 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -915,6 +915,7 @@ class NormalOriginOperationBase protected: Nullable mPersistenceType; OriginScope mOriginScope; + mozilla::Atomic mCanceled; const bool mExclusive; public: @@ -4196,7 +4197,11 @@ QuotaManager::InitializeOrigin(PersistenceType aPersistenceType, return NS_ERROR_UNEXPECTED; } - rv = mClients[clientType]->InitOrigin(aPersistenceType, aGroup, aOrigin, + Atomic dummy(false); + rv = mClients[clientType]->InitOrigin(aPersistenceType, + aGroup, + aOrigin, + /* aCanceled */ dummy, usageInfo); NS_ENSURE_SUCCESS(rv, rv); } @@ -6484,7 +6489,7 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, // If the directory exists then enumerate all the files inside, adding up // the sizes to get the final usage statistic. - if (exists && !mUsageInfo.Canceled()) { + if (exists && !mCanceled) { bool initialized; if (aPersistenceType == PERSISTENCE_TYPE_PERSISTENT) { @@ -6500,7 +6505,7 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && - hasMore && !mUsageInfo.Canceled()) { + hasMore && !mCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); NS_ENSURE_SUCCESS(rv, rv); @@ -6564,12 +6569,14 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, rv = client->GetUsageForOrigin(aPersistenceType, mGroup, mOriginScope.GetOrigin(), + mCanceled, &mUsageInfo); } else { rv = client->InitOrigin(aPersistenceType, mGroup, mOriginScope.GetOrigin(), + mCanceled, &mUsageInfo); } NS_ENSURE_SUCCESS(rv, rv); @@ -6630,7 +6637,7 @@ GetOriginUsageOp::SendResults() mResultCode = NS_ERROR_FAILURE; } } else { - if (mUsageInfo.Canceled()) { + if (mCanceled) { mResultCode = NS_ERROR_FAILURE; } @@ -6671,8 +6678,8 @@ GetOriginUsageOp::RecvCancel() { AssertIsOnOwningThread(); - nsresult rv = mUsageInfo.Cancel(); - if (NS_WARN_IF(NS_FAILED(rv))) { + if (mCanceled.exchange(true)) { + NS_WARNING("Canceled more than once?!"); return IPC_FAIL_NO_REASON(this); } diff --git a/dom/quota/Client.h b/dom/quota/Client.h index b70d3e606914..4ee5ed228646 100644 --- a/dom/quota/Client.h +++ b/dom/quota/Client.h @@ -31,6 +31,8 @@ class UsageInfo; class Client { public: + typedef mozilla::Atomic AtomicBool; + NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING enum Type { @@ -100,12 +102,14 @@ public: InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) = 0; virtual nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) = 0; virtual void diff --git a/dom/quota/UsageInfo.h b/dom/quota/UsageInfo.h index 688e168707fa..67b73195b54a 100644 --- a/dom/quota/UsageInfo.h +++ b/dom/quota/UsageInfo.h @@ -18,28 +18,14 @@ class UsageInfo { public: UsageInfo() - : mCanceled(false), mDatabaseUsage(0), mFileUsage(0), mLimit(0) + : mDatabaseUsage(0) + , mFileUsage(0) + , mLimit(0) { } virtual ~UsageInfo() { } - bool - Canceled() - { - return mCanceled; - } - - nsresult - Cancel() - { - if (mCanceled.exchange(true)) { - NS_WARNING("Canceled more than once?!"); - return NS_ERROR_UNEXPECTED; - } - return NS_OK; - } - void AppendToDatabaseUsage(uint64_t aUsage) { @@ -104,9 +90,6 @@ public: } } -protected: - mozilla::Atomic mCanceled; - private: uint64_t mDatabaseUsage; uint64_t mFileUsage;