Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Unified Diff: net/disk_cache/simple/simple_backend_impl.cc

Issue 478573003: Connect SimpleCache Backend active_entries_ more closely to Entry lifetime. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove inline destructor Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 76335a754a2509386b85a267245fa761f5c4965b..6a15fd63038fb6a346f5eb7d24fa340f246e8547 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -195,6 +195,26 @@ void RecordIndexLoad(net::CacheType cache_type,
} // namespace
+// Removes an entry from the Backend's |active_entries_| when the entry is done.
+// Provided to each Entry as soon as it's added to |active_entries_|.
+class SimpleBackendImpl::EntryDisconnector
+ : public SimpleEntryImpl::BackendDisconnector {
+ public:
+ EntryDisconnector(uint64 entry_hash,
+ SimpleBackendImpl* backend)
+ : entry_hash_(entry_hash),
+ backend_(backend->AsWeakPtr()) {}
+
+ virtual ~EntryDisconnector() {
+ if (backend_)
Deprecated (see juliatuttle) 2014/08/22 19:26:37 It makes me uncomfortable that we've lost the "mak
gavinp 2014/08/25 13:18:27 DCHECK added. It's not clear what we're losing tho
+ backend_->active_entries_.erase(entry_hash_);
+ }
+
+ private:
+ uint64 entry_hash_;
+ base::WeakPtr<SimpleBackendImpl> backend_;
+};
+
SimpleBackendImpl::SimpleBackendImpl(
const FilePath& path,
int max_bytes,
@@ -251,10 +271,6 @@ int SimpleBackendImpl::GetMaxFileSize() const {
return index_->max_size() / kMaxFileRatio;
}
-void SimpleBackendImpl::OnDeactivated(const SimpleEntryImpl* entry) {
- active_entries_.erase(entry->entry_hash());
-}
-
void SimpleBackendImpl::OnDoomStart(uint64 entry_hash) {
// TODO(ttuttle): Revert to DCHECK once http://crbug.com/317138 is fixed.
CHECK_EQ(0u, entries_pending_doom_.count(entry_hash));
@@ -512,18 +528,17 @@ scoped_refptr<SimpleEntryImpl> SimpleBackendImpl::CreateOrFindActiveEntry(
const std::string& key) {
DCHECK_EQ(entry_hash, simple_util::GetEntryHashKey(key));
std::pair<EntryMap::iterator, bool> insert_result =
- active_entries_.insert(std::make_pair(entry_hash,
- base::WeakPtr<SimpleEntryImpl>()));
+ active_entries_.insert(EntryMap::value_type(entry_hash, NULL));
Deprecated (see juliatuttle) 2014/08/22 19:26:38 Ooh, that's cute, using ::value_type. Nice.
EntryMap::iterator& it = insert_result.first;
- if (insert_result.second)
- DCHECK(!it->second.get());
- if (!it->second.get()) {
- SimpleEntryImpl* entry = new SimpleEntryImpl(
+ if (insert_result.second) {
+ it->second = new SimpleEntryImpl(
Deprecated (see juliatuttle) 2014/08/22 19:26:37 I'd prefer if you had this named entry still and t
gavinp 2014/08/25 13:18:26 Done.
cache_type_, path_, entry_hash, entry_operations_mode_, this, net_log_);
- entry->SetKey(key);
- it->second = entry->AsWeakPtr();
+ scoped_ptr<EntryDisconnector>
+ entry_disconnector(new EntryDisconnector(entry_hash, this));
+ it->second->SetBackendDisconnector(
+ entry_disconnector.PassAs<SimpleEntryImpl::BackendDisconnector>());
+ it->second->SetKey(key);
Deprecated (see juliatuttle) 2014/08/22 19:26:38 Similarly, for no good reason, I'd prefer SetKey b
gavinp 2014/08/25 13:18:26 Done.
}
- DCHECK(it->second.get());
Deprecated (see juliatuttle) 2014/08/22 19:26:38 Why not change to DCHECK(it->second)?
gavinp 2014/08/25 13:18:26 Done.
// It's possible, but unlikely, that we have an entry hash collision with a
// currently active entry.
if (key != it->second->key()) {
@@ -531,7 +546,7 @@ scoped_refptr<SimpleEntryImpl> SimpleBackendImpl::CreateOrFindActiveEntry(
DCHECK_EQ(0U, active_entries_.count(entry_hash));
return CreateOrFindActiveEntry(entry_hash, key);
}
- return make_scoped_refptr(it->second.get());
+ return make_scoped_refptr(it->second);
}
int SimpleBackendImpl::OpenEntryFromHash(uint64 entry_hash,
@@ -640,14 +655,16 @@ void SimpleBackendImpl::OnEntryOpenedFromHash(
}
DCHECK(*entry);
std::pair<EntryMap::iterator, bool> insert_result =
- active_entries_.insert(std::make_pair(hash,
- base::WeakPtr<SimpleEntryImpl>()));
+ active_entries_.insert(EntryMap::value_type(hash, simple_entry));
EntryMap::iterator& it = insert_result.first;
const bool did_insert = insert_result.second;
if (did_insert) {
// There is no active entry corresponding to this hash. The entry created
// is put in the map of active entries and returned to the caller.
- it->second = simple_entry->AsWeakPtr();
+ scoped_ptr<EntryDisconnector>
Deprecated (see juliatuttle) 2014/08/22 19:26:37 Can we abstract out "add this entry to the map usi
gavinp 2014/08/25 13:18:27 I considered it. That method would have weird argu
+ entry_disconnector(new EntryDisconnector(hash, this));
+ it->second->SetBackendDisconnector(
Deprecated (see juliatuttle) 2014/08/22 19:26:37 I'd like a comment here that explicitly points out
gavinp 2014/08/25 13:18:27 I've beefed up the comment on this branch.
+ entry_disconnector.PassAs<SimpleEntryImpl::BackendDisconnector>());
callback.Run(error_code);
} else {
// The entry was made active with the key while the creation from hash

Powered by Google App Engine
This is Rietveld 408576698