| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "net/disk_cache/simple/simple_backend_impl.h" | 5 #include "net/disk_cache/simple/simple_backend_impl.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <cstdlib> | 8 #include <cstdlib> | 
| 9 #include <functional> | 9 #include <functional> | 
| 10 | 10 | 
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 282 } | 282 } | 
| 283 | 283 | 
| 284 void SimpleBackendImpl::OnDoomStart(uint64_t entry_hash) { | 284 void SimpleBackendImpl::OnDoomStart(uint64_t entry_hash) { | 
| 285   DCHECK_EQ(0u, entries_pending_doom_.count(entry_hash)); | 285   DCHECK_EQ(0u, entries_pending_doom_.count(entry_hash)); | 
| 286   entries_pending_doom_.insert( | 286   entries_pending_doom_.insert( | 
| 287       std::make_pair(entry_hash, std::vector<Closure>())); | 287       std::make_pair(entry_hash, std::vector<Closure>())); | 
| 288 } | 288 } | 
| 289 | 289 | 
| 290 void SimpleBackendImpl::OnDoomComplete(uint64_t entry_hash) { | 290 void SimpleBackendImpl::OnDoomComplete(uint64_t entry_hash) { | 
| 291   DCHECK_EQ(1u, entries_pending_doom_.count(entry_hash)); | 291   DCHECK_EQ(1u, entries_pending_doom_.count(entry_hash)); | 
| 292   base::hash_map<uint64_t, std::vector<Closure>>::iterator it = | 292   std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 
| 293       entries_pending_doom_.find(entry_hash); | 293       entries_pending_doom_.find(entry_hash); | 
| 294   std::vector<Closure> to_run_closures; | 294   std::vector<Closure> to_run_closures; | 
| 295   to_run_closures.swap(it->second); | 295   to_run_closures.swap(it->second); | 
| 296   entries_pending_doom_.erase(it); | 296   entries_pending_doom_.erase(it); | 
| 297 | 297 | 
| 298   for (auto& closure : to_run_closures) | 298   for (auto& closure : to_run_closures) | 
| 299     closure.Run(); | 299     closure.Run(); | 
| 300 } | 300 } | 
| 301 | 301 | 
| 302 void SimpleBackendImpl::DoomEntries(std::vector<uint64_t>* entry_hashes, | 302 void SimpleBackendImpl::DoomEntries(std::vector<uint64_t>* entry_hashes, | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 371   return index_->GetEntryCount(); | 371   return index_->GetEntryCount(); | 
| 372 } | 372 } | 
| 373 | 373 | 
| 374 int SimpleBackendImpl::OpenEntry(const std::string& key, | 374 int SimpleBackendImpl::OpenEntry(const std::string& key, | 
| 375                                  Entry** entry, | 375                                  Entry** entry, | 
| 376                                  const CompletionCallback& callback) { | 376                                  const CompletionCallback& callback) { | 
| 377   const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 377   const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 
| 378 | 378 | 
| 379   // TODO(gavinp): Factor out this (not quite completely) repetitive code | 379   // TODO(gavinp): Factor out this (not quite completely) repetitive code | 
| 380   // block from OpenEntry/CreateEntry/DoomEntry. | 380   // block from OpenEntry/CreateEntry/DoomEntry. | 
| 381   base::hash_map<uint64_t, std::vector<Closure>>::iterator it = | 381   std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 
| 382       entries_pending_doom_.find(entry_hash); | 382       entries_pending_doom_.find(entry_hash); | 
| 383   if (it != entries_pending_doom_.end()) { | 383   if (it != entries_pending_doom_.end()) { | 
| 384     Callback<int(const net::CompletionCallback&)> operation = | 384     Callback<int(const net::CompletionCallback&)> operation = | 
| 385         base::Bind(&SimpleBackendImpl::OpenEntry, | 385         base::Bind(&SimpleBackendImpl::OpenEntry, | 
| 386                    base::Unretained(this), key, entry); | 386                    base::Unretained(this), key, entry); | 
| 387     it->second.push_back(base::Bind(&RunOperationAndCallback, | 387     it->second.push_back(base::Bind(&RunOperationAndCallback, | 
| 388                                     operation, callback)); | 388                                     operation, callback)); | 
| 389     return net::ERR_IO_PENDING; | 389     return net::ERR_IO_PENDING; | 
| 390   } | 390   } | 
| 391   scoped_refptr<SimpleEntryImpl> simple_entry = | 391   scoped_refptr<SimpleEntryImpl> simple_entry = | 
| 392       CreateOrFindActiveEntry(entry_hash, key); | 392       CreateOrFindActiveEntry(entry_hash, key); | 
| 393   CompletionCallback backend_callback = | 393   CompletionCallback backend_callback = | 
| 394       base::Bind(&SimpleBackendImpl::OnEntryOpenedFromKey, | 394       base::Bind(&SimpleBackendImpl::OnEntryOpenedFromKey, | 
| 395                  AsWeakPtr(), | 395                  AsWeakPtr(), | 
| 396                  key, | 396                  key, | 
| 397                  entry, | 397                  entry, | 
| 398                  simple_entry, | 398                  simple_entry, | 
| 399                  callback); | 399                  callback); | 
| 400   return simple_entry->OpenEntry(entry, backend_callback); | 400   return simple_entry->OpenEntry(entry, backend_callback); | 
| 401 } | 401 } | 
| 402 | 402 | 
| 403 int SimpleBackendImpl::CreateEntry(const std::string& key, | 403 int SimpleBackendImpl::CreateEntry(const std::string& key, | 
| 404                                    Entry** entry, | 404                                    Entry** entry, | 
| 405                                    const CompletionCallback& callback) { | 405                                    const CompletionCallback& callback) { | 
| 406   DCHECK_LT(0u, key.size()); | 406   DCHECK_LT(0u, key.size()); | 
| 407   const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 407   const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 
| 408 | 408 | 
| 409   base::hash_map<uint64_t, std::vector<Closure>>::iterator it = | 409   std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 
| 410       entries_pending_doom_.find(entry_hash); | 410       entries_pending_doom_.find(entry_hash); | 
| 411   if (it != entries_pending_doom_.end()) { | 411   if (it != entries_pending_doom_.end()) { | 
| 412     Callback<int(const net::CompletionCallback&)> operation = | 412     Callback<int(const net::CompletionCallback&)> operation = | 
| 413         base::Bind(&SimpleBackendImpl::CreateEntry, | 413         base::Bind(&SimpleBackendImpl::CreateEntry, | 
| 414                    base::Unretained(this), key, entry); | 414                    base::Unretained(this), key, entry); | 
| 415     it->second.push_back(base::Bind(&RunOperationAndCallback, | 415     it->second.push_back(base::Bind(&RunOperationAndCallback, | 
| 416                                     operation, callback)); | 416                                     operation, callback)); | 
| 417     return net::ERR_IO_PENDING; | 417     return net::ERR_IO_PENDING; | 
| 418   } | 418   } | 
| 419   scoped_refptr<SimpleEntryImpl> simple_entry = | 419   scoped_refptr<SimpleEntryImpl> simple_entry = | 
| 420       CreateOrFindActiveEntry(entry_hash, key); | 420       CreateOrFindActiveEntry(entry_hash, key); | 
| 421   return simple_entry->CreateEntry(entry, callback); | 421   return simple_entry->CreateEntry(entry, callback); | 
| 422 } | 422 } | 
| 423 | 423 | 
| 424 int SimpleBackendImpl::DoomEntry(const std::string& key, | 424 int SimpleBackendImpl::DoomEntry(const std::string& key, | 
| 425                                  const net::CompletionCallback& callback) { | 425                                  const net::CompletionCallback& callback) { | 
| 426   const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 426   const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 
| 427 | 427 | 
| 428   base::hash_map<uint64_t, std::vector<Closure>>::iterator it = | 428   std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 
| 429       entries_pending_doom_.find(entry_hash); | 429       entries_pending_doom_.find(entry_hash); | 
| 430   if (it != entries_pending_doom_.end()) { | 430   if (it != entries_pending_doom_.end()) { | 
| 431     Callback<int(const net::CompletionCallback&)> operation = | 431     Callback<int(const net::CompletionCallback&)> operation = | 
| 432         base::Bind(&SimpleBackendImpl::DoomEntry, base::Unretained(this), key); | 432         base::Bind(&SimpleBackendImpl::DoomEntry, base::Unretained(this), key); | 
| 433     it->second.push_back(base::Bind(&RunOperationAndCallback, | 433     it->second.push_back(base::Bind(&RunOperationAndCallback, | 
| 434                                     operation, callback)); | 434                                     operation, callback)); | 
| 435     return net::ERR_IO_PENDING; | 435     return net::ERR_IO_PENDING; | 
| 436   } | 436   } | 
| 437   scoped_refptr<SimpleEntryImpl> simple_entry = | 437   scoped_refptr<SimpleEntryImpl> simple_entry = | 
| 438       CreateOrFindActiveEntry(entry_hash, key); | 438       CreateOrFindActiveEntry(entry_hash, key); | 
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 624     it->second->Doom(); | 624     it->second->Doom(); | 
| 625     DCHECK_EQ(0U, active_entries_.count(entry_hash)); | 625     DCHECK_EQ(0U, active_entries_.count(entry_hash)); | 
| 626     return CreateOrFindActiveEntry(entry_hash, key); | 626     return CreateOrFindActiveEntry(entry_hash, key); | 
| 627   } | 627   } | 
| 628   return make_scoped_refptr(it->second); | 628   return make_scoped_refptr(it->second); | 
| 629 } | 629 } | 
| 630 | 630 | 
| 631 int SimpleBackendImpl::OpenEntryFromHash(uint64_t entry_hash, | 631 int SimpleBackendImpl::OpenEntryFromHash(uint64_t entry_hash, | 
| 632                                          Entry** entry, | 632                                          Entry** entry, | 
| 633                                          const CompletionCallback& callback) { | 633                                          const CompletionCallback& callback) { | 
| 634   base::hash_map<uint64_t, std::vector<Closure>>::iterator it = | 634   std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 
| 635       entries_pending_doom_.find(entry_hash); | 635       entries_pending_doom_.find(entry_hash); | 
| 636   if (it != entries_pending_doom_.end()) { | 636   if (it != entries_pending_doom_.end()) { | 
| 637     Callback<int(const net::CompletionCallback&)> operation = | 637     Callback<int(const net::CompletionCallback&)> operation = | 
| 638         base::Bind(&SimpleBackendImpl::OpenEntryFromHash, | 638         base::Bind(&SimpleBackendImpl::OpenEntryFromHash, | 
| 639                    base::Unretained(this), entry_hash, entry); | 639                    base::Unretained(this), entry_hash, entry); | 
| 640     it->second.push_back(base::Bind(&RunOperationAndCallback, | 640     it->second.push_back(base::Bind(&RunOperationAndCallback, | 
| 641                                     operation, callback)); | 641                                     operation, callback)); | 
| 642     return net::ERR_IO_PENDING; | 642     return net::ERR_IO_PENDING; | 
| 643   } | 643   } | 
| 644 | 644 | 
| 645   EntryMap::iterator has_active = active_entries_.find(entry_hash); | 645   EntryMap::iterator has_active = active_entries_.find(entry_hash); | 
| 646   if (has_active != active_entries_.end()) { | 646   if (has_active != active_entries_.end()) { | 
| 647     return OpenEntry(has_active->second->key(), entry, callback); | 647     return OpenEntry(has_active->second->key(), entry, callback); | 
| 648   } | 648   } | 
| 649 | 649 | 
| 650   scoped_refptr<SimpleEntryImpl> simple_entry = new SimpleEntryImpl( | 650   scoped_refptr<SimpleEntryImpl> simple_entry = new SimpleEntryImpl( | 
| 651       cache_type_, path_, entry_hash, entry_operations_mode_, this, net_log_); | 651       cache_type_, path_, entry_hash, entry_operations_mode_, this, net_log_); | 
| 652   CompletionCallback backend_callback = | 652   CompletionCallback backend_callback = | 
| 653       base::Bind(&SimpleBackendImpl::OnEntryOpenedFromHash, | 653       base::Bind(&SimpleBackendImpl::OnEntryOpenedFromHash, | 
| 654                  AsWeakPtr(), entry_hash, entry, simple_entry, callback); | 654                  AsWeakPtr(), entry_hash, entry, simple_entry, callback); | 
| 655   return simple_entry->OpenEntry(entry, backend_callback); | 655   return simple_entry->OpenEntry(entry, backend_callback); | 
| 656 } | 656 } | 
| 657 | 657 | 
| 658 int SimpleBackendImpl::DoomEntryFromHash(uint64_t entry_hash, | 658 int SimpleBackendImpl::DoomEntryFromHash(uint64_t entry_hash, | 
| 659                                          const CompletionCallback& callback) { | 659                                          const CompletionCallback& callback) { | 
| 660   Entry** entry = new Entry*(); | 660   Entry** entry = new Entry*(); | 
| 661   scoped_ptr<Entry*> scoped_entry(entry); | 661   scoped_ptr<Entry*> scoped_entry(entry); | 
| 662 | 662 | 
| 663   base::hash_map<uint64_t, std::vector<Closure>>::iterator pending_it = | 663   std::unordered_map<uint64_t, std::vector<Closure>>::iterator pending_it = | 
| 664       entries_pending_doom_.find(entry_hash); | 664       entries_pending_doom_.find(entry_hash); | 
| 665   if (pending_it != entries_pending_doom_.end()) { | 665   if (pending_it != entries_pending_doom_.end()) { | 
| 666     Callback<int(const net::CompletionCallback&)> operation = | 666     Callback<int(const net::CompletionCallback&)> operation = | 
| 667         base::Bind(&SimpleBackendImpl::DoomEntryFromHash, | 667         base::Bind(&SimpleBackendImpl::DoomEntryFromHash, | 
| 668                    base::Unretained(this), entry_hash); | 668                    base::Unretained(this), entry_hash); | 
| 669     pending_it->second.push_back(base::Bind(&RunOperationAndCallback, | 669     pending_it->second.push_back(base::Bind(&RunOperationAndCallback, | 
| 670                                     operation, callback)); | 670                                     operation, callback)); | 
| 671     return net::ERR_IO_PENDING; | 671     return net::ERR_IO_PENDING; | 
| 672   } | 672   } | 
| 673 | 673 | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 746 } | 746 } | 
| 747 | 747 | 
| 748 // static | 748 // static | 
| 749 void SimpleBackendImpl::FlushWorkerPoolForTesting() { | 749 void SimpleBackendImpl::FlushWorkerPoolForTesting() { | 
| 750   // We only need to do this if we there is an active task runner. | 750   // We only need to do this if we there is an active task runner. | 
| 751   if (base::ThreadTaskRunnerHandle::IsSet()) | 751   if (base::ThreadTaskRunnerHandle::IsSet()) | 
| 752     g_sequenced_worker_pool.Get().FlushForTesting(); | 752     g_sequenced_worker_pool.Get().FlushForTesting(); | 
| 753 } | 753 } | 
| 754 | 754 | 
| 755 }  // namespace disk_cache | 755 }  // namespace disk_cache | 
| OLD | NEW | 
|---|