| 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 ffdc9b185b366ef95a2f1b6ca91a89714e6423f5..2e165760b779f69a5807f3476e50561f7eb3d3aa 100644
|
| --- a/net/disk_cache/simple/simple_backend_impl.cc
|
| +++ b/net/disk_cache/simple/simple_backend_impl.cc
|
| @@ -483,9 +483,7 @@ int SimpleBackendImpl::OpenNextEntry(void** iter,
|
| }
|
|
|
| void SimpleBackendImpl::EndEnumeration(void** iter) {
|
| - SimpleIndex::HashList* entry_list =
|
| - static_cast<SimpleIndex::HashList*>(*iter);
|
| - delete entry_list;
|
| + active_enumerations_.Remove(IteratorToEnumerationId(iter));
|
| *iter = NULL;
|
| }
|
|
|
| @@ -501,6 +499,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,
|
| const DiskStatResult& result) {
|
| if (result.net_error == net::OK) {
|
| @@ -623,11 +642,15 @@ void SimpleBackendImpl::GetNextEntryInIterator(
|
| callback.Run(error_code);
|
| return;
|
| }
|
| + std::vector<uint64>* entry_list = NULL;
|
| if (*iter == NULL) {
|
| - *iter = index()->GetAllHashes().release();
|
| + 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));
|
| }
|
| - SimpleIndex::HashList* entry_list =
|
| - static_cast<SimpleIndex::HashList*>(*iter);
|
| while (entry_list->size() > 0) {
|
| uint64 entry_hash = entry_list->back();
|
| entry_list->pop_back();
|
|
|