Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Unified Diff: webkit/quota/quota_manager.cc

Issue 7056006: QuotaManager::GetUsageAndQuota should not hung when the returned usage is negative (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/quota/quota_manager.cc
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc
index 2d24e0b5b9b3ab718a55c9d0e378232f5dfe6102..b6266b4c6d1d54f983143ebae5fb02a93b3c152a 100644
--- a/webkit/quota/quota_manager.cc
+++ b/webkit/quota/quota_manager.cc
@@ -120,16 +120,25 @@ class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask {
global_usage_(-1),
host_usage_(-1),
quota_status_(kQuotaStatusUnknown),
+ waiting_callbacks_(1),
callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
virtual ~UsageAndQuotaDispatcherTask() {
STLDeleteContainerPointers(callbacks_.begin(), callbacks_.end());
}
- virtual bool IsCompleted() const = 0;
-
+ // Subclasses must implement them.
+ virtual void RunBody() = 0;
virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) = 0;
+ virtual void Run() OVERRIDE {
+ RunBody();
+ // We initialize waiting_callbacks to 1 so that we won't run
+ // the completion callback until here even some of the callbacks
+ // are dispatched synchronously.
+ CheckCompleted();
+ }
+
virtual void Aborted() OVERRIDE {
for (CallbackList::iterator iter = callbacks_.begin();
iter != callbacks_.end();
@@ -144,6 +153,7 @@ class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask {
virtual void Completed() OVERRIDE {
DeleteSoon();
}
+
QuotaManager* manager() const {
return static_cast<QuotaManager*>(observer());
}
@@ -153,31 +163,35 @@ class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask {
int64 quota() const { return quota_; }
int64 global_usage() const { return global_usage_; }
int64 host_usage() const { return host_usage_; }
- QuotaStatusCode status() const { return quota_status_; }
+ QuotaStatusCode quota_status() const { return quota_status_; }
UsageCallback* NewGlobalUsageCallback() {
+ ++waiting_callbacks_;
Dai Mikurube (NOT FULLTIME) 2011/05/20 09:19:08 Counting this up when generating looks a little st
kinuko 2011/05/20 09:27:23 GetGlobalUsage() etc is called in subclasses and I
Dai Mikurube (NOT FULLTIME) 2011/05/23 02:16:11 I guess you mean adding AddWaitingCallback(), for
kinuko 2011/05/23 03:31:54 That was what I meant when I wrote the previous co
return callback_factory_.NewCallback(
&UsageAndQuotaDispatcherTask::DidGetGlobalUsage);
}
HostUsageCallback* NewHostUsageCallback() {
+ ++waiting_callbacks_;
return callback_factory_.NewCallback(
&UsageAndQuotaDispatcherTask::DidGetHostUsage);
}
QuotaCallback* NewGlobalQuotaCallback() {
+ ++waiting_callbacks_;
return callback_factory_.NewCallback(
&UsageAndQuotaDispatcherTask::DidGetGlobalQuota);
}
HostQuotaCallback* NewHostQuotaCallback() {
+ ++waiting_callbacks_;
return callback_factory_.NewCallback(
&UsageAndQuotaDispatcherTask::DidGetHostQuota);
}
private:
void CheckCompleted() {
- if (IsCompleted()) {
+ if (--waiting_callbacks_ <= 0) {
// Dispatches callbacks.
for (CallbackList::iterator iter = callbacks_.begin();
iter != callbacks_.end();
@@ -202,6 +216,7 @@ class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask {
int64 host_usage_;
QuotaStatusCode quota_status_;
CallbackList callbacks_;
+ int waiting_callbacks_;
ScopedCallbackFactory<UsageAndQuotaDispatcherTask> callback_factory_;
DISALLOW_COPY_AND_ASSIGN(UsageAndQuotaDispatcherTask);
@@ -215,7 +230,7 @@ class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary
: UsageAndQuotaDispatcherTask(manager, host, kStorageTypeTemporary) {}
protected:
- virtual void Run() OVERRIDE {
+ virtual void RunBody() OVERRIDE {
manager()->temporary_usage_tracker_->GetGlobalUsage(
NewGlobalUsageCallback());
manager()->temporary_usage_tracker_->GetHostUsage(
@@ -223,16 +238,12 @@ class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary
manager()->GetTemporaryGlobalQuota(NewGlobalQuotaCallback());
}
- virtual bool IsCompleted() const OVERRIDE {
- return (quota() >= 0 && global_usage() >= 0 && host_usage() >= 0);
- }
-
virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) OVERRIDE {
// TODO(kinuko): For now it returns pessimistic quota. Change this
// to return {usage, quota - nonevictable_usage} once eviction is
// supported.
int64 other_usage = global_usage() - host_usage();
- callback->Run(status(), host_usage(), quota() - other_usage);
+ callback->Run(quota_status(), host_usage(), quota() - other_usage);
}
};
@@ -244,19 +255,15 @@ class QuotaManager::UsageAndQuotaDispatcherTaskForPersistent
: UsageAndQuotaDispatcherTask(manager, host, kStorageTypePersistent) {}
protected:
- virtual void Run() OVERRIDE {
+ virtual void RunBody() OVERRIDE {
manager()->persistent_usage_tracker_->GetHostUsage(
host(), NewHostUsageCallback());
manager()->GetPersistentHostQuota(
host(), NewHostQuotaCallback());
}
- virtual bool IsCompleted() const OVERRIDE {
- return (quota() >= 0 && host_usage() >= 0);
- }
-
virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) OVERRIDE {
- callback->Run(status(), host_usage(), quota());
+ callback->Run(quota_status(), host_usage(), quota());
}
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698