Chromium Code Reviews| 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()); |
| } |
| }; |