| 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 0d258351a351bd4a5bddf186e750cac9fc4a324a..c38b2bb9e33b49fa7e4945edc7380b235b5d3b8a 100644
|
| --- a/net/disk_cache/blockfile/backend_impl.cc
|
| +++ b/net/disk_cache/blockfile/backend_impl.cc
|
| @@ -328,13 +328,6 @@ void BackendImpl::CleanupCache() {
|
|
|
| // ------------------------------------------------------------------------
|
|
|
| -int BackendImpl::OpenPrevEntry(void** iter, Entry** prev_entry,
|
| - const CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| - background_queue_.OpenPrevEntry(iter, prev_entry, callback);
|
| - return net::ERR_IO_PENDING;
|
| -}
|
| -
|
| int BackendImpl::SyncOpenEntry(const std::string& key, Entry** entry) {
|
| DCHECK(entry);
|
| *entry = OpenEntryImpl(key);
|
| @@ -444,11 +437,6 @@ int BackendImpl::SyncOpenNextEntry(void** iter, Entry** next_entry) {
|
| return (*next_entry) ? net::OK : net::ERR_FAILED;
|
| }
|
|
|
| -int BackendImpl::SyncOpenPrevEntry(void** iter, Entry** prev_entry) {
|
| - *prev_entry = OpenPrevEntryImpl(iter);
|
| - return (*prev_entry) ? net::OK : net::ERR_FAILED;
|
| -}
|
| -
|
| void BackendImpl::SyncEndEnumeration(void* iter) {
|
| scoped_ptr<Rankings::Iterator> iterator(
|
| reinterpret_cast<Rankings::Iterator*>(iter));
|
| @@ -617,11 +605,74 @@ EntryImpl* BackendImpl::CreateEntryImpl(const std::string& key) {
|
| }
|
|
|
| EntryImpl* BackendImpl::OpenNextEntryImpl(void** iter) {
|
| - return OpenFollowingEntry(true, iter);
|
| -}
|
| + 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;
|
|
|
| -EntryImpl* BackendImpl::OpenPrevEntryImpl(void** iter) {
|
| - return OpenFollowingEntry(false, iter);
|
| + if (!iterator.get()) {
|
| + iterator.reset(new Rankings::Iterator(&rankings_));
|
| + bool ret = false;
|
| +
|
| + // Get an entry from each list.
|
| + for (int i = 0; i < kListsToSearch; i++) {
|
| + EntryImpl* temp = NULL;
|
| + ret |= OpenFollowingEntryFromList(static_cast<Rankings::List>(i),
|
| + &iterator->nodes[i], &temp);
|
| + entries[i].swap(&temp); // The entry was already addref'd.
|
| + }
|
| + if (!ret)
|
| + return NULL;
|
| + } else {
|
| + // Get the next entry from the last list, and the actual entries for the
|
| + // elements on the other lists.
|
| + for (int i = 0; i < kListsToSearch; i++) {
|
| + EntryImpl* temp = NULL;
|
| + if (iterator->list == i) {
|
| + OpenFollowingEntryFromList(
|
| + iterator->list, &iterator->nodes[i], &temp);
|
| + } else {
|
| + temp = GetEnumeratedEntry(iterator->nodes[i],
|
| + static_cast<Rankings::List>(i));
|
| + }
|
| +
|
| + entries[i].swap(&temp); // The entry was already addref'd.
|
| + }
|
| + }
|
| +
|
| + int newest = -1;
|
| + int oldest = -1;
|
| + Time access_times[kListsToSearch];
|
| + for (int i = 0; i < kListsToSearch; i++) {
|
| + if (entries[i].get()) {
|
| + access_times[i] = entries[i]->GetLastUsed();
|
| + if (newest < 0) {
|
| + DCHECK_LT(oldest, 0);
|
| + newest = oldest = i;
|
| + continue;
|
| + }
|
| + if (access_times[i] > access_times[newest])
|
| + newest = i;
|
| + if (access_times[i] < access_times[oldest])
|
| + oldest = i;
|
| + }
|
| + }
|
| +
|
| + if (newest < 0 || oldest < 0)
|
| + 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;
|
| }
|
|
|
| bool BackendImpl::SetMaxSize(int max_bytes) {
|
| @@ -1619,85 +1670,7 @@ EntryImpl* BackendImpl::MatchEntry(const std::string& key, uint32 hash,
|
| return tmp;
|
| }
|
|
|
| -// This is the actual implementation for OpenNextEntry and OpenPrevEntry.
|
| -EntryImpl* BackendImpl::OpenFollowingEntry(bool forward, void** iter) {
|
| - 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_));
|
| - bool ret = false;
|
| -
|
| - // Get an entry from each list.
|
| - for (int i = 0; i < kListsToSearch; i++) {
|
| - EntryImpl* temp = NULL;
|
| - ret |= OpenFollowingEntryFromList(forward, static_cast<Rankings::List>(i),
|
| - &iterator->nodes[i], &temp);
|
| - entries[i].swap(&temp); // The entry was already addref'd.
|
| - }
|
| - if (!ret)
|
| - return NULL;
|
| - } else {
|
| - // Get the next entry from the last list, and the actual entries for the
|
| - // elements on the other lists.
|
| - for (int i = 0; i < kListsToSearch; i++) {
|
| - EntryImpl* temp = NULL;
|
| - if (iterator->list == i) {
|
| - OpenFollowingEntryFromList(forward, iterator->list,
|
| - &iterator->nodes[i], &temp);
|
| - } else {
|
| - temp = GetEnumeratedEntry(iterator->nodes[i],
|
| - static_cast<Rankings::List>(i));
|
| - }
|
| -
|
| - entries[i].swap(&temp); // The entry was already addref'd.
|
| - }
|
| - }
|
| -
|
| - int newest = -1;
|
| - int oldest = -1;
|
| - Time access_times[kListsToSearch];
|
| - for (int i = 0; i < kListsToSearch; i++) {
|
| - if (entries[i].get()) {
|
| - access_times[i] = entries[i]->GetLastUsed();
|
| - if (newest < 0) {
|
| - DCHECK_LT(oldest, 0);
|
| - newest = oldest = i;
|
| - continue;
|
| - }
|
| - if (access_times[i] > access_times[newest])
|
| - newest = i;
|
| - if (access_times[i] < access_times[oldest])
|
| - oldest = i;
|
| - }
|
| - }
|
| -
|
| - if (newest < 0 || oldest < 0)
|
| - return NULL;
|
| -
|
| - EntryImpl* next_entry;
|
| - if (forward) {
|
| - next_entry = entries[newest].get();
|
| - iterator->list = static_cast<Rankings::List>(newest);
|
| - } else {
|
| - next_entry = entries[oldest].get();
|
| - iterator->list = static_cast<Rankings::List>(oldest);
|
| - }
|
| -
|
| - *iter = iterator.release();
|
| - next_entry->AddRef();
|
| - return next_entry;
|
| -}
|
| -
|
| -bool BackendImpl::OpenFollowingEntryFromList(bool forward, Rankings::List list,
|
| +bool BackendImpl::OpenFollowingEntryFromList(Rankings::List list,
|
| CacheRankingsBlock** from_entry,
|
| EntryImpl** next_entry) {
|
| if (disabled_)
|
| @@ -1707,9 +1680,7 @@ bool BackendImpl::OpenFollowingEntryFromList(bool forward, Rankings::List list,
|
| return false;
|
|
|
| Rankings::ScopedRankingsBlock rankings(&rankings_, *from_entry);
|
| - CacheRankingsBlock* next_block = forward ?
|
| - rankings_.GetNext(rankings.get(), list) :
|
| - rankings_.GetPrev(rankings.get(), list);
|
| + CacheRankingsBlock* next_block = rankings_.GetNext(rankings.get(), list);
|
| Rankings::ScopedRankingsBlock next(&rankings_, next_block);
|
| *from_entry = NULL;
|
|
|
|
|