Bug 1348660 - Part 3: Separate the canceled state out of UsageInfo; r=btseng

This commit is contained in:
Jan Varga 2017-03-22 12:13:54 +01:00
Родитель 4221505b78
Коммит ae1ee28451
6 изменённых файлов: 60 добавлений и 46 удалений

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

@ -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<nsISupports> entry;
rv = entries->GetNext(getter_AddRefs(entry));
NS_ENSURE_SUCCESS(rv, rv);

20
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<bool>& aCanceled,
UsageInfo* aUsageInfo)
{
nsCOMPtr<nsISimpleEnumerator> 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<nsISupports> 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<nsISupports> 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!");

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

@ -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<nsString>& aSubdirsToProcess,
nsTHashtable<nsStringHashKey>& 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<nsString, 20> subdirsToProcess;
nsTHashtable<nsStringHashKey> 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<nsString, 20> subdirsToProcess;
nsTHashtable<nsStringHashKey> 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<nsIFile> 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<nsString>& aSubdirsToProcess,
nsTHashtable<nsStringHashKey>& aDatabaseFilenames)
{
AssertIsOnIOThread();
MOZ_ASSERT(aDirectory);
nsCOMPtr<nsISimpleEnumerator> 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<nsISupports> 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<nsISupports> 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;
}

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

@ -915,6 +915,7 @@ class NormalOriginOperationBase
protected:
Nullable<PersistenceType> mPersistenceType;
OriginScope mOriginScope;
mozilla::Atomic<bool> 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<bool> 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<nsISupports> 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);
}

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

@ -31,6 +31,8 @@ class UsageInfo;
class Client
{
public:
typedef mozilla::Atomic<bool> 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

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

@ -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<bool> mCanceled;
private:
uint64_t mDatabaseUsage;
uint64_t mFileUsage;