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 #include <limits> | 10 #include <limits> |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 } | 377 } |
378 | 378 |
379 int32_t SimpleBackendImpl::GetEntryCount() const { | 379 int32_t SimpleBackendImpl::GetEntryCount() const { |
380 // TODO(pasko): Use directory file count when index is not ready. | 380 // TODO(pasko): Use directory file count when index is not ready. |
381 return index_->GetEntryCount(); | 381 return index_->GetEntryCount(); |
382 } | 382 } |
383 | 383 |
384 int SimpleBackendImpl::OpenEntry(const std::string& key, | 384 int SimpleBackendImpl::OpenEntry(const std::string& key, |
385 Entry** entry, | 385 Entry** entry, |
386 const CompletionCallback& callback) { | 386 const CompletionCallback& callback) { |
| 387 return OpenEntryWithOracleByte(key, entry, OracleCallback(), callback); |
| 388 } |
| 389 |
| 390 int SimpleBackendImpl::OpenEntryWithOracleByte( |
| 391 const std::string& key, |
| 392 Entry** entry, |
| 393 const OracleCallback& oracle, |
| 394 const CompletionCallback& callback) { |
387 const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 395 const uint64_t entry_hash = simple_util::GetEntryHashKey(key); |
388 | 396 |
389 // TODO(gavinp): Factor out this (not quite completely) repetitive code | 397 // TODO(gavinp): Factor out this (not quite completely) repetitive code |
390 // block from OpenEntry/CreateEntry/DoomEntry. | 398 // block from OpenEntry/CreateEntry/DoomEntry. |
391 std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 399 std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = |
392 entries_pending_doom_.find(entry_hash); | 400 entries_pending_doom_.find(entry_hash); |
393 if (it != entries_pending_doom_.end()) { | 401 if (it != entries_pending_doom_.end()) { |
394 Callback<int(const net::CompletionCallback&)> operation = | 402 Callback<int(const net::CompletionCallback&)> operation = |
395 base::Bind(&SimpleBackendImpl::OpenEntry, | 403 base::Bind(&SimpleBackendImpl::OpenEntry, |
396 base::Unretained(this), key, entry); | 404 base::Unretained(this), key, entry); |
397 it->second.push_back(base::Bind(&RunOperationAndCallback, | 405 it->second.push_back(base::Bind(&RunOperationAndCallback, |
398 operation, callback)); | 406 operation, callback)); |
399 return net::ERR_IO_PENDING; | 407 return net::ERR_IO_PENDING; |
400 } | 408 } |
401 scoped_refptr<SimpleEntryImpl> simple_entry = | 409 scoped_refptr<SimpleEntryImpl> simple_entry = |
402 CreateOrFindActiveEntry(entry_hash, key); | 410 CreateOrFindActiveEntry(entry_hash, key); |
403 return simple_entry->OpenEntry(entry, callback); | 411 return simple_entry->OpenEntry(entry, oracle, callback); |
404 } | 412 } |
405 | 413 |
406 int SimpleBackendImpl::CreateEntry(const std::string& key, | 414 int SimpleBackendImpl::CreateEntry(const std::string& key, |
407 Entry** entry, | 415 Entry** entry, |
408 const CompletionCallback& callback) { | 416 const CompletionCallback& callback) { |
409 DCHECK_LT(0u, key.size()); | 417 DCHECK_LT(0u, key.size()); |
410 const uint64_t entry_hash = simple_util::GetEntryHashKey(key); | 418 const uint64_t entry_hash = simple_util::GetEntryHashKey(key); |
411 | 419 |
412 std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = | 420 std::unordered_map<uint64_t, std::vector<Closure>>::iterator it = |
413 entries_pending_doom_.find(entry_hash); | 421 entries_pending_doom_.find(entry_hash); |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 EntryMap::iterator has_active = active_entries_.find(entry_hash); | 701 EntryMap::iterator has_active = active_entries_.find(entry_hash); |
694 if (has_active != active_entries_.end()) { | 702 if (has_active != active_entries_.end()) { |
695 return OpenEntry(has_active->second->key(), entry, callback); | 703 return OpenEntry(has_active->second->key(), entry, callback); |
696 } | 704 } |
697 | 705 |
698 scoped_refptr<SimpleEntryImpl> simple_entry = new SimpleEntryImpl( | 706 scoped_refptr<SimpleEntryImpl> simple_entry = new SimpleEntryImpl( |
699 cache_type_, path_, entry_hash, entry_operations_mode_, this, net_log_); | 707 cache_type_, path_, entry_hash, entry_operations_mode_, this, net_log_); |
700 CompletionCallback backend_callback = | 708 CompletionCallback backend_callback = |
701 base::Bind(&SimpleBackendImpl::OnEntryOpenedFromHash, | 709 base::Bind(&SimpleBackendImpl::OnEntryOpenedFromHash, |
702 AsWeakPtr(), entry_hash, entry, simple_entry, callback); | 710 AsWeakPtr(), entry_hash, entry, simple_entry, callback); |
703 return simple_entry->OpenEntry(entry, backend_callback); | 711 return simple_entry->OpenEntry(entry, OracleCallback(), backend_callback); |
704 } | 712 } |
705 | 713 |
706 int SimpleBackendImpl::DoomEntryFromHash(uint64_t entry_hash, | 714 int SimpleBackendImpl::DoomEntryFromHash(uint64_t entry_hash, |
707 const CompletionCallback& callback) { | 715 const CompletionCallback& callback) { |
708 Entry** entry = new Entry*(); | 716 Entry** entry = new Entry*(); |
709 std::unique_ptr<Entry*> scoped_entry(entry); | 717 std::unique_ptr<Entry*> scoped_entry(entry); |
710 | 718 |
711 std::unordered_map<uint64_t, std::vector<Closure>>::iterator pending_it = | 719 std::unordered_map<uint64_t, std::vector<Closure>>::iterator pending_it = |
712 entries_pending_doom_.find(entry_hash); | 720 entries_pending_doom_.find(entry_hash); |
713 if (pending_it != entries_pending_doom_.end()) { | 721 if (pending_it != entries_pending_doom_.end()) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 // There was no active entry corresponding to this hash. We've already put | 758 // There was no active entry corresponding to this hash. We've already put |
751 // the entry opened from hash in the |active_entries_|. We now provide the | 759 // the entry opened from hash in the |active_entries_|. We now provide the |
752 // proxy object to the entry. | 760 // proxy object to the entry. |
753 it->second->SetActiveEntryProxy(ActiveEntryProxy::Create(hash, this)); | 761 it->second->SetActiveEntryProxy(ActiveEntryProxy::Create(hash, this)); |
754 callback.Run(net::OK); | 762 callback.Run(net::OK); |
755 } else { | 763 } else { |
756 // The entry was made active while we waiting for the open from hash to | 764 // The entry was made active while we waiting for the open from hash to |
757 // finish. The entry created from hash needs to be closed, and the one | 765 // finish. The entry created from hash needs to be closed, and the one |
758 // in |active_entries_| can be returned to the caller. | 766 // in |active_entries_| can be returned to the caller. |
759 simple_entry->Close(); | 767 simple_entry->Close(); |
760 it->second->OpenEntry(entry, callback); | 768 it->second->OpenEntry(entry, OracleCallback(), callback); |
761 } | 769 } |
762 } | 770 } |
763 | 771 |
764 void SimpleBackendImpl::DoomEntriesComplete( | 772 void SimpleBackendImpl::DoomEntriesComplete( |
765 std::unique_ptr<std::vector<uint64_t>> entry_hashes, | 773 std::unique_ptr<std::vector<uint64_t>> entry_hashes, |
766 const net::CompletionCallback& callback, | 774 const net::CompletionCallback& callback, |
767 int result) { | 775 int result) { |
768 for (const uint64_t& entry_hash : *entry_hashes) | 776 for (const uint64_t& entry_hash : *entry_hashes) |
769 OnDoomComplete(entry_hash); | 777 OnDoomComplete(entry_hash); |
770 callback.Run(result); | 778 callback.Run(result); |
771 } | 779 } |
772 | 780 |
773 // static | 781 // static |
774 void SimpleBackendImpl::FlushWorkerPoolForTesting() { | 782 void SimpleBackendImpl::FlushWorkerPoolForTesting() { |
775 // We only need to do this if we there is an active task runner. | 783 // We only need to do this if we there is an active task runner. |
776 if (base::ThreadTaskRunnerHandle::IsSet()) | 784 if (base::ThreadTaskRunnerHandle::IsSet()) |
777 g_sequenced_worker_pool.Get().FlushForTesting(); | 785 g_sequenced_worker_pool.Get().FlushForTesting(); |
778 } | 786 } |
779 | 787 |
780 } // namespace disk_cache | 788 } // namespace disk_cache |
OLD | NEW |