| Index: net/disk_cache/memory/mem_backend_impl.cc
|
| diff --git a/net/disk_cache/memory/mem_backend_impl.cc b/net/disk_cache/memory/mem_backend_impl.cc
|
| index e69c00edf636a45379a7f29db182512dd8a67c36..848ef985db9c4621711dd9ce47cba396445286fa 100644
|
| --- a/net/disk_cache/memory/mem_backend_impl.cc
|
| +++ b/net/disk_cache/memory/mem_backend_impl.cc
|
| @@ -29,7 +29,8 @@ int LowWaterAdjust(int high_water) {
|
| namespace disk_cache {
|
|
|
| MemBackendImpl::MemBackendImpl(net::NetLog* net_log)
|
| - : max_size_(0), current_size_(0), net_log_(net_log) {}
|
| + : max_size_(0), current_size_(0), net_log_(net_log), weak_factory_(this) {
|
| +}
|
|
|
| MemBackendImpl::~MemBackendImpl() {
|
| EntryMap::iterator it = entries_.begin();
|
| @@ -180,16 +181,40 @@ int MemBackendImpl::DoomEntriesSince(const base::Time initial_time,
|
| return net::ERR_FAILED;
|
| }
|
|
|
| -int MemBackendImpl::OpenNextEntry(void** iter, Entry** next_entry,
|
| - const CompletionCallback& callback) {
|
| - if (OpenNextEntry(iter, next_entry))
|
| - return net::OK;
|
| +class MemBackendImpl::MemIterator : public Backend::Iterator {
|
| + public:
|
| + explicit MemIterator(base::WeakPtr<MemBackendImpl> backend)
|
| + : backend_(backend), current_(NULL) {
|
| + }
|
|
|
| - return net::ERR_FAILED;
|
| -}
|
| + virtual int OpenNextEntry(Entry** next_entry,
|
| + const CompletionCallback& callback) OVERRIDE {
|
| + if (!backend_)
|
| + return net::ERR_FAILED;
|
| +
|
| + MemEntryImpl* node = backend_->rankings_.GetNext(current_);
|
| + // We should never return a child entry so iterate until we hit a parent
|
| + // entry.
|
| + while (node && node->type() != MemEntryImpl::kParentEntry)
|
| + node = backend_->rankings_.GetNext(node);
|
| + *next_entry = node;
|
| + current_ = node;
|
| +
|
| + if (node) {
|
| + node->Open();
|
| + return net::OK;
|
| + }
|
| + return net::ERR_FAILED;
|
| + }
|
|
|
| -void MemBackendImpl::EndEnumeration(void** iter) {
|
| - *iter = NULL;
|
| + private:
|
| + base::WeakPtr<MemBackendImpl> backend_;
|
| + MemEntryImpl* current_;
|
| +};
|
| +
|
| +scoped_ptr<Backend::Iterator> MemBackendImpl::CreateIterator() {
|
| + return scoped_ptr<Backend::Iterator>(
|
| + new MemIterator(weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| void MemBackendImpl::OnExternalCacheHit(const std::string& key) {
|
| @@ -287,23 +312,6 @@ bool MemBackendImpl::DoomEntriesSince(const Time initial_time) {
|
| }
|
| }
|
|
|
| -bool MemBackendImpl::OpenNextEntry(void** iter, Entry** next_entry) {
|
| - MemEntryImpl* current = reinterpret_cast<MemEntryImpl*>(*iter);
|
| - MemEntryImpl* node = rankings_.GetNext(current);
|
| - // We should never return a child entry so iterate until we hit a parent
|
| - // entry.
|
| - while (node && node->type() != MemEntryImpl::kParentEntry) {
|
| - node = rankings_.GetNext(node);
|
| - }
|
| - *next_entry = node;
|
| - *iter = node;
|
| -
|
| - if (node)
|
| - node->Open();
|
| -
|
| - return NULL != node;
|
| -}
|
| -
|
| void MemBackendImpl::TrimCache(bool empty) {
|
| MemEntryImpl* next = rankings_.GetPrev(NULL);
|
| if (!next)
|
|
|