Index: net/disk_cache/simple/simple_backend_impl.cc |
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc |
index e84211b7c8c997375969cc1835e65f7ef7d8ac86..2e165760b779f69a5807f3476e50561f7eb3d3aa 100644 |
--- a/net/disk_cache/simple/simple_backend_impl.cc |
+++ b/net/disk_cache/simple/simple_backend_impl.cc |
@@ -473,78 +473,18 @@ |
return DoomEntriesBetween(initial_time, Time(), callback); |
} |
-class SimpleBackendImpl::SimpleIterator FINAL : public Iterator { |
- public: |
- explicit SimpleIterator(base::WeakPtr<SimpleBackendImpl> backend) |
- : backend_(backend), |
- weak_factory_(this) { |
- } |
- |
- // From Backend::Iterator: |
- virtual int OpenNextEntry(Entry** next_entry, |
- const CompletionCallback& callback) OVERRIDE { |
- CompletionCallback open_next_entry_impl = |
- base::Bind(&SimpleIterator::OpenNextEntryImpl, |
- weak_factory_.GetWeakPtr(), next_entry, callback); |
- return backend_->index_->ExecuteWhenReady(open_next_entry_impl); |
- } |
- |
- void OpenNextEntryImpl(Entry** next_entry, |
- const CompletionCallback& callback, |
- int index_initialization_error_code) { |
- if (!backend_) { |
- callback.Run(net::ERR_FAILED); |
- return; |
- } |
- if (index_initialization_error_code != net::OK) { |
- callback.Run(index_initialization_error_code); |
- return; |
- } |
- if (!hashes_to_enumerate_) |
- hashes_to_enumerate_ = backend_->index()->GetAllHashes().Pass(); |
- |
- while (!hashes_to_enumerate_->empty()) { |
- uint64 entry_hash = hashes_to_enumerate_->back(); |
- hashes_to_enumerate_->pop_back(); |
- if (backend_->index()->Has(entry_hash)) { |
- *next_entry = NULL; |
- CompletionCallback continue_iteration = base::Bind( |
- &SimpleIterator::CheckIterationReturnValue, |
- weak_factory_.GetWeakPtr(), |
- next_entry, |
- callback); |
- int error_code_open = backend_->OpenEntryFromHash(entry_hash, |
- next_entry, |
- continue_iteration); |
- if (error_code_open == net::ERR_IO_PENDING) |
- return; |
- if (error_code_open != net::ERR_FAILED) { |
- callback.Run(error_code_open); |
- return; |
- } |
- } |
- } |
- callback.Run(net::ERR_FAILED); |
- } |
- |
- void CheckIterationReturnValue(Entry** entry, |
- const CompletionCallback& callback, |
- int error_code) { |
- if (error_code == net::ERR_FAILED) { |
- OpenNextEntry(entry, callback); |
- return; |
- } |
- callback.Run(error_code); |
- } |
- |
- private: |
- base::WeakPtr<SimpleBackendImpl> backend_; |
- scoped_ptr<std::vector<uint64> > hashes_to_enumerate_; |
- base::WeakPtrFactory<SimpleIterator> weak_factory_; |
-}; |
- |
-scoped_ptr<Backend::Iterator> SimpleBackendImpl::CreateIterator() { |
- return scoped_ptr<Iterator>(new SimpleIterator(AsWeakPtr())); |
+int SimpleBackendImpl::OpenNextEntry(void** iter, |
+ Entry** next_entry, |
+ const CompletionCallback& callback) { |
+ CompletionCallback get_next_entry = |
+ base::Bind(&SimpleBackendImpl::GetNextEntryInIterator, AsWeakPtr(), iter, |
+ next_entry, callback); |
+ return index_->ExecuteWhenReady(get_next_entry); |
+} |
+ |
+void SimpleBackendImpl::EndEnumeration(void** iter) { |
+ active_enumerations_.Remove(IteratorToEnumerationId(iter)); |
+ *iter = NULL; |
} |
void SimpleBackendImpl::GetStats( |
@@ -557,6 +497,27 @@ |
void SimpleBackendImpl::OnExternalCacheHit(const std::string& key) { |
index_->UseIfExists(simple_util::GetEntryHashKey(key)); |
+} |
+ |
+// static |
+SimpleBackendImpl::ActiveEnumerationMap::KeyType |
+ SimpleBackendImpl::IteratorToEnumerationId(void** iter) { |
+ COMPILE_ASSERT(sizeof(ptrdiff_t) >= sizeof(*iter), |
+ integer_type_must_fit_ptr_type_for_cast_to_be_reversible); |
+ const ptrdiff_t ptrdiff_enumeration_id = reinterpret_cast<ptrdiff_t>(*iter); |
+ const ActiveEnumerationMap::KeyType enumeration_id = ptrdiff_enumeration_id; |
+ DCHECK_EQ(enumeration_id, ptrdiff_enumeration_id); |
+ return enumeration_id; |
+} |
+ |
+// static |
+void* SimpleBackendImpl::EnumerationIdToIterator( |
+ ActiveEnumerationMap::KeyType enumeration_id) { |
+ const ptrdiff_t ptrdiff_enumeration_id = enumeration_id; |
+ DCHECK_EQ(enumeration_id, ptrdiff_enumeration_id); |
+ COMPILE_ASSERT(sizeof(ptrdiff_t) >= sizeof(void*), |
+ integer_type_must_fit_ptr_type_for_cast_to_be_reversible); |
+ return reinterpret_cast<void*>(ptrdiff_enumeration_id); |
} |
void SimpleBackendImpl::InitializeIndex(const CompletionCallback& callback, |
@@ -672,6 +633,49 @@ |
return net::ERR_IO_PENDING; |
} |
+void SimpleBackendImpl::GetNextEntryInIterator( |
+ void** iter, |
+ Entry** next_entry, |
+ const CompletionCallback& callback, |
+ int error_code) { |
+ if (error_code != net::OK) { |
+ callback.Run(error_code); |
+ return; |
+ } |
+ std::vector<uint64>* entry_list = NULL; |
+ if (*iter == NULL) { |
+ const ActiveEnumerationMap::KeyType new_enumeration_id = |
+ active_enumerations_.Add( |
+ entry_list = index()->GetAllHashes().release()); |
+ *iter = EnumerationIdToIterator(new_enumeration_id); |
+ } else { |
+ entry_list = active_enumerations_.Lookup(IteratorToEnumerationId(iter)); |
+ } |
+ while (entry_list->size() > 0) { |
+ uint64 entry_hash = entry_list->back(); |
+ entry_list->pop_back(); |
+ if (index()->Has(entry_hash)) { |
+ *next_entry = NULL; |
+ CompletionCallback continue_iteration = base::Bind( |
+ &SimpleBackendImpl::CheckIterationReturnValue, |
+ AsWeakPtr(), |
+ iter, |
+ next_entry, |
+ callback); |
+ int error_code_open = OpenEntryFromHash(entry_hash, |
+ next_entry, |
+ continue_iteration); |
+ if (error_code_open == net::ERR_IO_PENDING) |
+ return; |
+ if (error_code_open != net::ERR_FAILED) { |
+ callback.Run(error_code_open); |
+ return; |
+ } |
+ } |
+ } |
+ callback.Run(net::ERR_FAILED); |
+} |
+ |
void SimpleBackendImpl::OnEntryOpenedFromHash( |
uint64 hash, |
Entry** entry, |
@@ -725,6 +729,18 @@ |
callback.Run(final_code); |
} |
+void SimpleBackendImpl::CheckIterationReturnValue( |
+ void** iter, |
+ Entry** entry, |
+ const CompletionCallback& callback, |
+ int error_code) { |
+ if (error_code == net::ERR_FAILED) { |
+ OpenNextEntry(iter, entry, callback); |
+ return; |
+ } |
+ callback.Run(error_code); |
+} |
+ |
void SimpleBackendImpl::DoomEntriesComplete( |
scoped_ptr<std::vector<uint64> > entry_hashes, |
const net::CompletionCallback& callback, |