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

Side by Side Diff: net/http/http_cache.h

Issue 2002002: Http Cache: Handle the asynchronous instantiation of the... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | net/http/http_cache.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 // This file declares a HttpTransactionFactory implementation that can be 5 // This file declares a HttpTransactionFactory implementation that can be
6 // layered on top of another HttpTransactionFactory to add HTTP caching. The 6 // layered on top of another HttpTransactionFactory to add HTTP caching. The
7 // caching logic follows RFC 2616 (any exceptions are called out in the code). 7 // caching logic follows RFC 2616 (any exceptions are called out in the code).
8 // 8 //
9 // The HttpCache takes a disk_cache::Backend as a parameter, and uses that for 9 // The HttpCache takes a disk_cache::Backend as a parameter, and uses that for
10 // the cache storage. 10 // the cache storage.
11 // 11 //
12 // See HttpTransactionFactory and HttpTransaction for more details. 12 // See HttpTransactionFactory and HttpTransaction for more details.
13 13
14 #ifndef NET_HTTP_HTTP_CACHE_H_ 14 #ifndef NET_HTTP_HTTP_CACHE_H_
15 #define NET_HTTP_HTTP_CACHE_H_ 15 #define NET_HTTP_HTTP_CACHE_H_
16 16
17 #include <list> 17 #include <list>
18 #include <set> 18 #include <set>
19 19
20 #include "base/basictypes.h" 20 #include "base/basictypes.h"
21 #include "base/file_path.h" 21 #include "base/file_path.h"
22 #include "base/hash_tables.h" 22 #include "base/hash_tables.h"
23 #include "base/scoped_ptr.h" 23 #include "base/scoped_ptr.h"
24 #include "base/task.h" 24 #include "base/task.h"
25 #include "base/weak_ptr.h" 25 #include "base/weak_ptr.h"
26 #include "net/base/cache_type.h" 26 #include "net/base/cache_type.h"
27 #include "net/base/completion_callback.h" 27 #include "net/base/completion_callback.h"
28 #include "net/http/http_transaction_factory.h" 28 #include "net/http/http_transaction_factory.h"
29 #include "testing/gtest/include/gtest/gtest_prod.h"
29 30
30 class GURL; 31 class GURL;
31 class MessageLoop; 32 class MessageLoop;
32 class ViewCacheHelper; 33 class ViewCacheHelper;
33 34
34 namespace disk_cache { 35 namespace disk_cache {
35 class Backend; 36 class Backend;
36 class Entry; 37 class Entry;
37 } 38 }
38 39
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 kResponseInfoIndex = 0, 178 kResponseInfoIndex = 0,
178 kResponseContentIndex, 179 kResponseContentIndex,
179 kMetadataIndex, 180 kMetadataIndex,
180 181
181 // Must remain at the end of the enum. 182 // Must remain at the end of the enum.
182 kNumCacheEntryDataIndices 183 kNumCacheEntryDataIndices
183 }; 184 };
184 friend class ::ViewCacheHelper; 185 friend class ::ViewCacheHelper;
185 186
186 private: 187 private:
188 FRIEND_TEST(HttpCacheTest, SimpleGET_WaitForBackend);
189 FRIEND_TEST(HttpCacheTest, SimpleGET_WaitForBackend_CancelCreate);
187 190
188 // Types -------------------------------------------------------------------- 191 // Types --------------------------------------------------------------------
189 192
190 class BackendCallback; 193 class BackendCallback;
191 class MetadataWriter; 194 class MetadataWriter;
192 class Transaction; 195 class Transaction;
193 class WorkItem; 196 class WorkItem;
194 friend class Transaction; 197 friend class Transaction;
195 struct NewEntry; // Info for an entry under construction. 198 struct PendingOp; // Info for an entry under construction.
196 199
197 typedef std::list<Transaction*> TransactionList; 200 typedef std::list<Transaction*> TransactionList;
198 typedef std::list<WorkItem*> WorkItemList; 201 typedef std::list<WorkItem*> WorkItemList;
199 202
200 struct ActiveEntry { 203 struct ActiveEntry {
201 disk_cache::Entry* disk_entry; 204 disk_cache::Entry* disk_entry;
202 Transaction* writer; 205 Transaction* writer;
203 TransactionList readers; 206 TransactionList readers;
204 TransactionList pending_queue; 207 TransactionList pending_queue;
205 bool will_process_pending_queue; 208 bool will_process_pending_queue;
206 bool doomed; 209 bool doomed;
207 210
208 explicit ActiveEntry(disk_cache::Entry*); 211 explicit ActiveEntry(disk_cache::Entry*);
209 ~ActiveEntry(); 212 ~ActiveEntry();
210 }; 213 };
211 214
212 typedef base::hash_map<std::string, ActiveEntry*> ActiveEntriesMap; 215 typedef base::hash_map<std::string, ActiveEntry*> ActiveEntriesMap;
213 typedef base::hash_map<std::string, NewEntry*> NewEntriesMap; 216 typedef base::hash_map<std::string, PendingOp*> PendingOpsMap;
214 typedef std::set<ActiveEntry*> ActiveEntriesSet; 217 typedef std::set<ActiveEntry*> ActiveEntriesSet;
215 218
219 typedef int (*CreateCacheBackendFn)(CacheType, const FilePath&, int,
220 bool, MessageLoop*, disk_cache::Backend**,
221 CompletionCallback*);
222
216 // Methods ------------------------------------------------------------------ 223 // Methods ------------------------------------------------------------------
217 224
225 // Creates the |backend| object and notifies the |callback| when the operation
226 // completes. Returns an error code.
227 int CreateBackend(disk_cache::Backend** backend,
228 CompletionCallback* callback);
229
230 // Makes sure that the backend creation is complete before allowing the
231 // provided transaction to use the object. Returns an error code. |trans|
232 // will be notified via its IO callback if this method returns ERR_IO_PENDING.
233 // The transaction is free to use the backend directly at any time after
234 // receiving the notification.
235 int GetBackendForTransaction(Transaction* trans);
236
218 // Generates the cache key for this request. 237 // Generates the cache key for this request.
219 std::string GenerateCacheKey(const HttpRequestInfo*); 238 std::string GenerateCacheKey(const HttpRequestInfo*);
220 239
221 // Dooms the entry selected by |key|. |trans| will be notified via its IO 240 // Dooms the entry selected by |key|. |trans| will be notified via its IO
222 // callback if this method returns ERR_IO_PENDING. The entry can be 241 // callback if this method returns ERR_IO_PENDING. The entry can be
223 // currently in use or not. 242 // currently in use or not.
224 int DoomEntry(const std::string& key, Transaction* trans); 243 int DoomEntry(const std::string& key, Transaction* trans);
225 244
226 // Dooms the entry selected by |key|. |trans| will be notified via its IO 245 // Dooms the entry selected by |key|. |trans| will be notified via its IO
227 // callback if this method returns ERR_IO_PENDING. The entry should not 246 // callback if this method returns ERR_IO_PENDING. The entry should not
(...skipping 11 matching lines...) Expand all
239 // TODO(rvargas): remove the |key| argument. 258 // TODO(rvargas): remove the |key| argument.
240 ActiveEntry* ActivateEntry(const std::string& key, 259 ActiveEntry* ActivateEntry(const std::string& key,
241 disk_cache::Entry* disk_entry); 260 disk_cache::Entry* disk_entry);
242 261
243 // Deletes an ActiveEntry. 262 // Deletes an ActiveEntry.
244 void DeactivateEntry(ActiveEntry* entry); 263 void DeactivateEntry(ActiveEntry* entry);
245 264
246 // Deletes an ActiveEntry using an exhaustive search. 265 // Deletes an ActiveEntry using an exhaustive search.
247 void SlowDeactivateEntry(ActiveEntry* entry); 266 void SlowDeactivateEntry(ActiveEntry* entry);
248 267
249 // Returns the NewEntry for the desired |key|. If an entry is not under 268 // Returns the PendingOp for the desired |key|. If an entry is not under
250 // construction already, a new NewEntry structure is created. 269 // construction already, a new PendingOp structure is created.
251 NewEntry* GetNewEntry(const std::string& key); 270 PendingOp* GetPendingOp(const std::string& key);
252 271
253 // Deletes a NewEntry. 272 // Deletes a PendingOp.
254 void DeleteNewEntry(NewEntry* entry); 273 void DeletePendingOp(PendingOp* pending_op);
255 274
256 // Opens the disk cache entry associated with |key|, returning an ActiveEntry 275 // Opens the disk cache entry associated with |key|, returning an ActiveEntry
257 // in |*entry|. |trans| will be notified via its IO callback if this method 276 // in |*entry|. |trans| will be notified via its IO callback if this method
258 // returns ERR_IO_PENDING. 277 // returns ERR_IO_PENDING.
259 int OpenEntry(const std::string& key, ActiveEntry** entry, 278 int OpenEntry(const std::string& key, ActiveEntry** entry,
260 Transaction* trans); 279 Transaction* trans);
261 280
262 // Creates the disk cache entry associated with |key|, returning an 281 // Creates the disk cache entry associated with |key|, returning an
263 // ActiveEntry in |*entry|. |trans| will be notified via its IO callback if 282 // ActiveEntry in |*entry|. |trans| will be notified via its IO callback if
264 // this method returns ERR_IO_PENDING. 283 // this method returns ERR_IO_PENDING.
(...skipping 20 matching lines...) Expand all
285 void DoneWritingToEntry(ActiveEntry* entry, bool success); 304 void DoneWritingToEntry(ActiveEntry* entry, bool success);
286 305
287 // Called when the transaction has finished reading from this entry. 306 // Called when the transaction has finished reading from this entry.
288 void DoneReadingFromEntry(ActiveEntry* entry, Transaction* trans); 307 void DoneReadingFromEntry(ActiveEntry* entry, Transaction* trans);
289 308
290 // Convers the active writter transaction to a reader so that other 309 // Convers the active writter transaction to a reader so that other
291 // transactions can start reading from this entry. 310 // transactions can start reading from this entry.
292 void ConvertWriterToReader(ActiveEntry* entry); 311 void ConvertWriterToReader(ActiveEntry* entry);
293 312
294 // Removes the transaction |trans|, from the pending list of an entry 313 // Removes the transaction |trans|, from the pending list of an entry
295 // (NewEntry, active or doomed entry). 314 // (PendingOp, active or doomed entry).
296 void RemovePendingTransaction(Transaction* trans); 315 void RemovePendingTransaction(Transaction* trans);
297 316
298 // Removes the transaction |trans|, from the pending list of |entry|. 317 // Removes the transaction |trans|, from the pending list of |entry|.
299 bool RemovePendingTransactionFromEntry(ActiveEntry* entry, 318 bool RemovePendingTransactionFromEntry(ActiveEntry* entry,
300 Transaction* trans); 319 Transaction* trans);
301 320
302 // Removes the transaction |trans|, from the pending list of |entry|. 321 // Removes the transaction |trans|, from the pending list of |pending_op|.
303 bool RemovePendingTransactionFromNewEntry(NewEntry* entry, 322 bool RemovePendingTransactionFromPendingOp(PendingOp* pending_op,
304 Transaction* trans); 323 Transaction* trans);
305 324
306 // Resumes processing the pending list of |entry|. 325 // Resumes processing the pending list of |entry|.
307 void ProcessPendingQueue(ActiveEntry* entry); 326 void ProcessPendingQueue(ActiveEntry* entry);
308 327
309 // Events (called via PostTask) --------------------------------------------- 328 // Events (called via PostTask) ---------------------------------------------
310 329
311 void OnProcessPendingQueue(ActiveEntry* entry); 330 void OnProcessPendingQueue(ActiveEntry* entry);
312 331
313 // Callbacks ---------------------------------------------------------------- 332 // Callbacks ----------------------------------------------------------------
314 333
315 // Processes BackendCallback notifications. 334 // Processes BackendCallback notifications.
316 void OnIOComplete(int result, NewEntry* entry); 335 void OnIOComplete(int result, PendingOp* entry);
336
337 // Processes the backend creation notification.
338 void OnBackendCreated(int result, PendingOp* pending_op);
317 339
318 340
319 // Variables ---------------------------------------------------------------- 341 // Variables ----------------------------------------------------------------
320 342
321 // Used when lazily constructing the disk_cache_. 343 // Used when lazily constructing the disk_cache_.
322 FilePath disk_cache_dir_; 344 FilePath disk_cache_dir_;
323 MessageLoop* cache_thread_; 345 MessageLoop* cache_thread_;
346 disk_cache::Backend* temp_backend_;
347 bool building_backend_;
324 348
325 Mode mode_; 349 Mode mode_;
326 CacheType type_; 350 CacheType type_;
327 351
328 scoped_ptr<HttpTransactionFactory> network_layer_; 352 scoped_ptr<HttpTransactionFactory> network_layer_;
329 scoped_ptr<disk_cache::Backend> disk_cache_; 353 scoped_ptr<disk_cache::Backend> disk_cache_;
330 354
331 // The set of active entries indexed by cache key. 355 // The set of active entries indexed by cache key.
332 ActiveEntriesMap active_entries_; 356 ActiveEntriesMap active_entries_;
333 357
334 // The set of doomed entries. 358 // The set of doomed entries.
335 ActiveEntriesSet doomed_entries_; 359 ActiveEntriesSet doomed_entries_;
336 360
337 // The set of entries "under construction". 361 // The set of entries "under construction".
338 NewEntriesMap new_entries_; 362 PendingOpsMap pending_ops_;
339 363
340 ScopedRunnableMethodFactory<HttpCache> task_factory_; 364 ScopedRunnableMethodFactory<HttpCache> task_factory_;
341 365
342 bool enable_range_support_; 366 bool enable_range_support_;
343 int cache_size_; 367 int cache_size_;
344 368
345 typedef base::hash_map<std::string, int> PlaybackCacheMap; 369 typedef base::hash_map<std::string, int> PlaybackCacheMap;
346 scoped_ptr<PlaybackCacheMap> playback_cache_map_; 370 scoped_ptr<PlaybackCacheMap> playback_cache_map_;
347 371
372 // Used for unit tests.
373 CreateCacheBackendFn create_backend_fn_;
374
348 DISALLOW_COPY_AND_ASSIGN(HttpCache); 375 DISALLOW_COPY_AND_ASSIGN(HttpCache);
349 }; 376 };
350 377
351 } // namespace net 378 } // namespace net
352 379
353 #endif // NET_HTTP_HTTP_CACHE_H_ 380 #endif // NET_HTTP_HTTP_CACHE_H_
OLDNEW
« no previous file with comments | « no previous file | net/http/http_cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698