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 |