Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/quota/quota_manager.h" | 5 #include "webkit/quota/quota_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 QuotaManager* manager, | 113 QuotaManager* manager, |
| 114 const std::string& host, | 114 const std::string& host, |
| 115 StorageType type) | 115 StorageType type) |
| 116 : QuotaTask(manager), | 116 : QuotaTask(manager), |
| 117 host_(host), | 117 host_(host), |
| 118 type_(type), | 118 type_(type), |
| 119 quota_(-1), | 119 quota_(-1), |
| 120 global_usage_(-1), | 120 global_usage_(-1), |
| 121 host_usage_(-1), | 121 host_usage_(-1), |
| 122 quota_status_(kQuotaStatusUnknown), | 122 quota_status_(kQuotaStatusUnknown), |
| 123 waiting_callbacks_(1), | |
| 123 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} | 124 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
| 124 | 125 |
| 125 virtual ~UsageAndQuotaDispatcherTask() { | 126 virtual ~UsageAndQuotaDispatcherTask() { |
| 126 STLDeleteContainerPointers(callbacks_.begin(), callbacks_.end()); | 127 STLDeleteContainerPointers(callbacks_.begin(), callbacks_.end()); |
| 127 } | 128 } |
| 128 | 129 |
| 129 virtual bool IsCompleted() const = 0; | 130 // Subclasses must implement them. |
| 131 virtual void RunBody() = 0; | |
| 132 virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) = 0; | |
| 130 | 133 |
| 131 virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) = 0; | 134 virtual void Run() OVERRIDE { |
| 135 RunBody(); | |
| 136 // We initialize waiting_callbacks to 1 so that we won't run | |
| 137 // the completion callback until here even some of the callbacks | |
| 138 // are dispatched synchronously. | |
| 139 CheckCompleted(); | |
| 140 } | |
| 132 | 141 |
| 133 virtual void Aborted() OVERRIDE { | 142 virtual void Aborted() OVERRIDE { |
| 134 for (CallbackList::iterator iter = callbacks_.begin(); | 143 for (CallbackList::iterator iter = callbacks_.begin(); |
| 135 iter != callbacks_.end(); | 144 iter != callbacks_.end(); |
| 136 ++iter) { | 145 ++iter) { |
| 137 (*iter)->Run(kQuotaErrorAbort, 0, 0); | 146 (*iter)->Run(kQuotaErrorAbort, 0, 0); |
| 138 delete *iter; | 147 delete *iter; |
| 139 } | 148 } |
| 140 callbacks_.clear(); | 149 callbacks_.clear(); |
| 141 DeleteSoon(); | 150 DeleteSoon(); |
| 142 } | 151 } |
| 143 | 152 |
| 144 virtual void Completed() OVERRIDE { | 153 virtual void Completed() OVERRIDE { |
| 145 DeleteSoon(); | 154 DeleteSoon(); |
| 146 } | 155 } |
| 156 | |
| 147 QuotaManager* manager() const { | 157 QuotaManager* manager() const { |
| 148 return static_cast<QuotaManager*>(observer()); | 158 return static_cast<QuotaManager*>(observer()); |
| 149 } | 159 } |
| 150 | 160 |
| 151 std::string host() const { return host_; } | 161 std::string host() const { return host_; } |
| 152 StorageType type() const { return type_; } | 162 StorageType type() const { return type_; } |
| 153 int64 quota() const { return quota_; } | 163 int64 quota() const { return quota_; } |
| 154 int64 global_usage() const { return global_usage_; } | 164 int64 global_usage() const { return global_usage_; } |
| 155 int64 host_usage() const { return host_usage_; } | 165 int64 host_usage() const { return host_usage_; } |
| 156 QuotaStatusCode status() const { return quota_status_; } | 166 QuotaStatusCode quota_status() const { return quota_status_; } |
| 157 | 167 |
| 158 UsageCallback* NewGlobalUsageCallback() { | 168 UsageCallback* NewGlobalUsageCallback() { |
| 169 ++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
| |
| 159 return callback_factory_.NewCallback( | 170 return callback_factory_.NewCallback( |
| 160 &UsageAndQuotaDispatcherTask::DidGetGlobalUsage); | 171 &UsageAndQuotaDispatcherTask::DidGetGlobalUsage); |
| 161 } | 172 } |
| 162 | 173 |
| 163 HostUsageCallback* NewHostUsageCallback() { | 174 HostUsageCallback* NewHostUsageCallback() { |
| 175 ++waiting_callbacks_; | |
| 164 return callback_factory_.NewCallback( | 176 return callback_factory_.NewCallback( |
| 165 &UsageAndQuotaDispatcherTask::DidGetHostUsage); | 177 &UsageAndQuotaDispatcherTask::DidGetHostUsage); |
| 166 } | 178 } |
| 167 | 179 |
| 168 QuotaCallback* NewGlobalQuotaCallback() { | 180 QuotaCallback* NewGlobalQuotaCallback() { |
| 181 ++waiting_callbacks_; | |
| 169 return callback_factory_.NewCallback( | 182 return callback_factory_.NewCallback( |
| 170 &UsageAndQuotaDispatcherTask::DidGetGlobalQuota); | 183 &UsageAndQuotaDispatcherTask::DidGetGlobalQuota); |
| 171 } | 184 } |
| 172 | 185 |
| 173 HostQuotaCallback* NewHostQuotaCallback() { | 186 HostQuotaCallback* NewHostQuotaCallback() { |
| 187 ++waiting_callbacks_; | |
| 174 return callback_factory_.NewCallback( | 188 return callback_factory_.NewCallback( |
| 175 &UsageAndQuotaDispatcherTask::DidGetHostQuota); | 189 &UsageAndQuotaDispatcherTask::DidGetHostQuota); |
| 176 } | 190 } |
| 177 | 191 |
| 178 private: | 192 private: |
| 179 void CheckCompleted() { | 193 void CheckCompleted() { |
| 180 if (IsCompleted()) { | 194 if (--waiting_callbacks_ <= 0) { |
| 181 // Dispatches callbacks. | 195 // Dispatches callbacks. |
| 182 for (CallbackList::iterator iter = callbacks_.begin(); | 196 for (CallbackList::iterator iter = callbacks_.begin(); |
| 183 iter != callbacks_.end(); | 197 iter != callbacks_.end(); |
| 184 ++iter) { | 198 ++iter) { |
| 185 DispatchCallback(*iter); | 199 DispatchCallback(*iter); |
| 186 delete *iter; | 200 delete *iter; |
| 187 } | 201 } |
| 188 callbacks_.clear(); | 202 callbacks_.clear(); |
| 189 UsageAndQuotaDispatcherTaskMap& dispatcher_map = | 203 UsageAndQuotaDispatcherTaskMap& dispatcher_map = |
| 190 manager()->usage_and_quota_dispatchers_; | 204 manager()->usage_and_quota_dispatchers_; |
| 191 DCHECK(dispatcher_map.find(std::make_pair(host_, type_)) != | 205 DCHECK(dispatcher_map.find(std::make_pair(host_, type_)) != |
| 192 dispatcher_map.end()); | 206 dispatcher_map.end()); |
| 193 dispatcher_map.erase(std::make_pair(host_, type_)); | 207 dispatcher_map.erase(std::make_pair(host_, type_)); |
| 194 CallCompleted(); | 208 CallCompleted(); |
| 195 } | 209 } |
| 196 } | 210 } |
| 197 | 211 |
| 198 const std::string host_; | 212 const std::string host_; |
| 199 const StorageType type_; | 213 const StorageType type_; |
| 200 int64 quota_; | 214 int64 quota_; |
| 201 int64 global_usage_; | 215 int64 global_usage_; |
| 202 int64 host_usage_; | 216 int64 host_usage_; |
| 203 QuotaStatusCode quota_status_; | 217 QuotaStatusCode quota_status_; |
| 204 CallbackList callbacks_; | 218 CallbackList callbacks_; |
| 219 int waiting_callbacks_; | |
| 205 ScopedCallbackFactory<UsageAndQuotaDispatcherTask> callback_factory_; | 220 ScopedCallbackFactory<UsageAndQuotaDispatcherTask> callback_factory_; |
| 206 | 221 |
| 207 DISALLOW_COPY_AND_ASSIGN(UsageAndQuotaDispatcherTask); | 222 DISALLOW_COPY_AND_ASSIGN(UsageAndQuotaDispatcherTask); |
| 208 }; | 223 }; |
| 209 | 224 |
| 210 class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary | 225 class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary |
| 211 : public QuotaManager::UsageAndQuotaDispatcherTask { | 226 : public QuotaManager::UsageAndQuotaDispatcherTask { |
| 212 public: | 227 public: |
| 213 UsageAndQuotaDispatcherTaskForTemporary( | 228 UsageAndQuotaDispatcherTaskForTemporary( |
| 214 QuotaManager* manager, const std::string host) | 229 QuotaManager* manager, const std::string host) |
| 215 : UsageAndQuotaDispatcherTask(manager, host, kStorageTypeTemporary) {} | 230 : UsageAndQuotaDispatcherTask(manager, host, kStorageTypeTemporary) {} |
| 216 | 231 |
| 217 protected: | 232 protected: |
| 218 virtual void Run() OVERRIDE { | 233 virtual void RunBody() OVERRIDE { |
| 219 manager()->temporary_usage_tracker_->GetGlobalUsage( | 234 manager()->temporary_usage_tracker_->GetGlobalUsage( |
| 220 NewGlobalUsageCallback()); | 235 NewGlobalUsageCallback()); |
| 221 manager()->temporary_usage_tracker_->GetHostUsage( | 236 manager()->temporary_usage_tracker_->GetHostUsage( |
| 222 host(), NewHostUsageCallback()); | 237 host(), NewHostUsageCallback()); |
| 223 manager()->GetTemporaryGlobalQuota(NewGlobalQuotaCallback()); | 238 manager()->GetTemporaryGlobalQuota(NewGlobalQuotaCallback()); |
| 224 } | 239 } |
| 225 | 240 |
| 226 virtual bool IsCompleted() const OVERRIDE { | |
| 227 return (quota() >= 0 && global_usage() >= 0 && host_usage() >= 0); | |
| 228 } | |
| 229 | |
| 230 virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) OVERRIDE { | 241 virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) OVERRIDE { |
| 231 // TODO(kinuko): For now it returns pessimistic quota. Change this | 242 // TODO(kinuko): For now it returns pessimistic quota. Change this |
| 232 // to return {usage, quota - nonevictable_usage} once eviction is | 243 // to return {usage, quota - nonevictable_usage} once eviction is |
| 233 // supported. | 244 // supported. |
| 234 int64 other_usage = global_usage() - host_usage(); | 245 int64 other_usage = global_usage() - host_usage(); |
| 235 callback->Run(status(), host_usage(), quota() - other_usage); | 246 callback->Run(quota_status(), host_usage(), quota() - other_usage); |
| 236 } | 247 } |
| 237 }; | 248 }; |
| 238 | 249 |
| 239 class QuotaManager::UsageAndQuotaDispatcherTaskForPersistent | 250 class QuotaManager::UsageAndQuotaDispatcherTaskForPersistent |
| 240 : public QuotaManager::UsageAndQuotaDispatcherTask { | 251 : public QuotaManager::UsageAndQuotaDispatcherTask { |
| 241 public: | 252 public: |
| 242 UsageAndQuotaDispatcherTaskForPersistent( | 253 UsageAndQuotaDispatcherTaskForPersistent( |
| 243 QuotaManager* manager, const std::string host) | 254 QuotaManager* manager, const std::string host) |
| 244 : UsageAndQuotaDispatcherTask(manager, host, kStorageTypePersistent) {} | 255 : UsageAndQuotaDispatcherTask(manager, host, kStorageTypePersistent) {} |
| 245 | 256 |
| 246 protected: | 257 protected: |
| 247 virtual void Run() OVERRIDE { | 258 virtual void RunBody() OVERRIDE { |
| 248 manager()->persistent_usage_tracker_->GetHostUsage( | 259 manager()->persistent_usage_tracker_->GetHostUsage( |
| 249 host(), NewHostUsageCallback()); | 260 host(), NewHostUsageCallback()); |
| 250 manager()->GetPersistentHostQuota( | 261 manager()->GetPersistentHostQuota( |
| 251 host(), NewHostQuotaCallback()); | 262 host(), NewHostQuotaCallback()); |
| 252 } | 263 } |
| 253 | 264 |
| 254 virtual bool IsCompleted() const OVERRIDE { | |
| 255 return (quota() >= 0 && host_usage() >= 0); | |
| 256 } | |
| 257 | |
| 258 virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) OVERRIDE { | 265 virtual void DispatchCallback(GetUsageAndQuotaCallback* callback) OVERRIDE { |
| 259 callback->Run(status(), host_usage(), quota()); | 266 callback->Run(quota_status(), host_usage(), quota()); |
| 260 } | 267 } |
| 261 }; | 268 }; |
| 262 | 269 |
| 263 // static | 270 // static |
| 264 QuotaManager::UsageAndQuotaDispatcherTask* | 271 QuotaManager::UsageAndQuotaDispatcherTask* |
| 265 QuotaManager::UsageAndQuotaDispatcherTask::Create( | 272 QuotaManager::UsageAndQuotaDispatcherTask::Create( |
| 266 QuotaManager* manager, const std::string& host, StorageType type) { | 273 QuotaManager* manager, const std::string& host, StorageType type) { |
| 267 switch (type) { | 274 switch (type) { |
| 268 case kStorageTypeTemporary: | 275 case kStorageTypeTemporary: |
| 269 return new UsageAndQuotaDispatcherTaskForTemporary( | 276 return new UsageAndQuotaDispatcherTaskForTemporary( |
| (...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1081 | 1088 |
| 1082 QuotaManagerProxy::QuotaManagerProxy( | 1089 QuotaManagerProxy::QuotaManagerProxy( |
| 1083 QuotaManager* manager, base::MessageLoopProxy* io_thread) | 1090 QuotaManager* manager, base::MessageLoopProxy* io_thread) |
| 1084 : manager_(manager), io_thread_(io_thread) { | 1091 : manager_(manager), io_thread_(io_thread) { |
| 1085 } | 1092 } |
| 1086 | 1093 |
| 1087 QuotaManagerProxy::~QuotaManagerProxy() { | 1094 QuotaManagerProxy::~QuotaManagerProxy() { |
| 1088 } | 1095 } |
| 1089 | 1096 |
| 1090 } // namespace quota | 1097 } // namespace quota |
| OLD | NEW |