Chromium Code Reviews| Index: net/disk_cache/blockfile/backend_impl.cc |
| diff --git a/net/disk_cache/blockfile/backend_impl.cc b/net/disk_cache/blockfile/backend_impl.cc |
| index b2785431d38bbf97fa97823e70322f764e8fd364..4082743429f9829a6dc77abfd5e88fb90606bf20 100644 |
| --- a/net/disk_cache/blockfile/backend_impl.cc |
| +++ b/net/disk_cache/blockfile/backend_impl.cc |
| @@ -381,14 +381,14 @@ int BackendImpl::SyncDoomEntriesBetween(const base::Time initial_time, |
| return net::ERR_FAILED; |
| EntryImpl* node; |
| - void* iter = NULL; |
| - EntryImpl* next = OpenNextEntryImpl(&iter); |
| + scoped_ptr<Rankings::Iterator> iterator(new Rankings::Iterator()); |
| + EntryImpl* next = OpenNextEntryImpl(iterator.get()); |
| if (!next) |
| return net::OK; |
| while (next) { |
| node = next; |
| - next = OpenNextEntryImpl(&iter); |
| + next = OpenNextEntryImpl(iterator.get()); |
| if (node->GetLastUsed() >= initial_time && |
| node->GetLastUsed() < end_time) { |
| @@ -397,7 +397,7 @@ int BackendImpl::SyncDoomEntriesBetween(const base::Time initial_time, |
| if (next) |
| next->Release(); |
| next = NULL; |
| - SyncEndEnumeration(iter); |
| + SyncEndEnumeration(iterator.Pass()); |
| } |
| node->Release(); |
| @@ -415,31 +415,31 @@ int BackendImpl::SyncDoomEntriesSince(const base::Time initial_time) { |
| stats_.OnEvent(Stats::DOOM_RECENT); |
| for (;;) { |
| - void* iter = NULL; |
| - EntryImpl* entry = OpenNextEntryImpl(&iter); |
| + scoped_ptr<Rankings::Iterator> iterator(new Rankings::Iterator()); |
| + EntryImpl* entry = OpenNextEntryImpl(iterator.get()); |
| if (!entry) |
| return net::OK; |
| if (initial_time > entry->GetLastUsed()) { |
| entry->Release(); |
| - SyncEndEnumeration(iter); |
| + SyncEndEnumeration(iterator.Pass()); |
| return net::OK; |
| } |
| entry->DoomImpl(); |
| entry->Release(); |
| - SyncEndEnumeration(iter); // Dooming the entry invalidates the iterator. |
| + SyncEndEnumeration(iterator.Pass()); // The doom invalidated the iterator. |
| } |
| } |
| -int BackendImpl::SyncOpenNextEntry(void** iter, Entry** next_entry) { |
| - *next_entry = OpenNextEntryImpl(iter); |
| +int BackendImpl::SyncOpenNextEntry(Rankings::Iterator* iterator, |
| + Entry** next_entry) { |
| + *next_entry = OpenNextEntryImpl(iterator); |
| return (*next_entry) ? net::OK : net::ERR_FAILED; |
| } |
| -void BackendImpl::SyncEndEnumeration(void* iter) { |
| - scoped_ptr<Rankings::Iterator> iterator( |
| - reinterpret_cast<Rankings::Iterator*>(iter)); |
| +void BackendImpl::SyncEndEnumeration(scoped_ptr<Rankings::Iterator> iterator) { |
| + iterator->Reset(); |
| } |
| void BackendImpl::SyncOnExternalCacheHit(const std::string& key) { |
| @@ -604,20 +604,14 @@ EntryImpl* BackendImpl::CreateEntryImpl(const std::string& key) { |
| return cache_entry.get(); |
| } |
| -EntryImpl* BackendImpl::OpenNextEntryImpl(void** iter) { |
| +EntryImpl* BackendImpl::OpenNextEntryImpl(Rankings::Iterator* iterator) { |
| if (disabled_) |
| return NULL; |
| - DCHECK(iter); |
| - |
| const int kListsToSearch = 3; |
| scoped_refptr<EntryImpl> entries[kListsToSearch]; |
| - scoped_ptr<Rankings::Iterator> iterator( |
| - reinterpret_cast<Rankings::Iterator*>(*iter)); |
| - *iter = NULL; |
| - |
| - if (!iterator.get()) { |
| - iterator.reset(new Rankings::Iterator(&rankings_)); |
| + if (!iterator->my_rankings) { |
| + iterator->my_rankings = &rankings_; |
| bool ret = false; |
| // Get an entry from each list. |
| @@ -627,8 +621,10 @@ EntryImpl* BackendImpl::OpenNextEntryImpl(void** iter) { |
| &iterator->nodes[i], &temp); |
| entries[i].swap(&temp); // The entry was already addref'd. |
| } |
| - if (!ret) |
| + if (!ret) { |
| + iterator->Reset(); |
| return NULL; |
| + } |
| } else { |
| // Get the next entry from the last list, and the actual entries for the |
| // elements on the other lists. |
| @@ -664,13 +660,14 @@ EntryImpl* BackendImpl::OpenNextEntryImpl(void** iter) { |
| } |
| } |
| - if (newest < 0 || oldest < 0) |
| + if (newest < 0 || oldest < 0) { |
| + iterator->Reset(); |
| return NULL; |
| + } |
| EntryImpl* next_entry; |
| next_entry = entries[newest].get(); |
| iterator->list = static_cast<Rankings::List>(newest); |
| - *iter = iterator.release(); |
| next_entry->AddRef(); |
| return next_entry; |
| } |
| @@ -1253,25 +1250,26 @@ int BackendImpl::DoomEntriesSince(const base::Time initial_time, |
| class BackendImpl::IteratorImpl : public Backend::Iterator { |
| public: |
| explicit IteratorImpl(base::WeakPtr<InFlightBackendIO> background_queue) |
| - : background_queue_(background_queue), data_(NULL) { |
| + : background_queue_(background_queue), |
| + iterator_(new Rankings::Iterator()) { |
| } |
| virtual ~IteratorImpl() { |
| if (background_queue_) |
| - background_queue_->EndEnumeration(data_); |
| + background_queue_->EndEnumeration(iterator_.Pass()); |
|
rvargas (doing something else)
2014/09/20 01:41:58
Technically, all that was needed was iterator_.rel
gavinp
2014/09/22 16:43:26
Absolutely. The rest of the changes amount to addi
|
| } |
| virtual int OpenNextEntry(Entry** next_entry, |
| const net::CompletionCallback& callback) OVERRIDE { |
| if (!background_queue_) |
| return net::ERR_FAILED; |
| - background_queue_->OpenNextEntry(&data_, next_entry, callback); |
| + background_queue_->OpenNextEntry(iterator_.get(), next_entry, callback); |
| return net::ERR_IO_PENDING; |
| } |
| private: |
| const base::WeakPtr<InFlightBackendIO> background_queue_; |
| - void* data_; |
| + scoped_ptr<Rankings::Iterator> iterator_; |
| }; |
| scoped_ptr<Backend::Iterator> BackendImpl::CreateIterator() { |