Index: net/http/http_cache.cc |
=================================================================== |
--- net/http/http_cache.cc (revision 19788) |
+++ net/http/http_cache.cc (working copy) |
@@ -1259,6 +1259,7 @@ |
host_resolver, proxy_service)), |
ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
in_memory_cache_(false), |
+ deleted_(false), |
cache_size_(cache_size) { |
} |
@@ -1271,6 +1272,7 @@ |
network_layer_(HttpNetworkLayer::CreateFactory(session)), |
ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
in_memory_cache_(false), |
+ deleted_(false), |
cache_size_(cache_size) { |
} |
@@ -1283,6 +1285,7 @@ |
host_resolver, proxy_service)), |
ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
in_memory_cache_(true), |
+ deleted_(false), |
cache_size_(cache_size) { |
} |
@@ -1294,6 +1297,7 @@ |
disk_cache_(disk_cache), |
ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
in_memory_cache_(false), |
+ deleted_(false), |
cache_size_(0) { |
} |
@@ -1314,6 +1318,9 @@ |
ActiveEntriesSet::iterator it = doomed_entries_.begin(); |
for (; it != doomed_entries_.end(); ++it) |
delete *it; |
+ |
+ // TODO(rvargas): remove this. I'm just tracking a few crashes. |
+ deleted_ = true; |
} |
HttpTransaction* HttpCache::CreateTransaction() { |
@@ -1571,6 +1578,10 @@ |
HttpCache::ActiveEntry* HttpCache::ActivateEntry( |
const std::string& key, |
disk_cache::Entry* disk_entry) { |
+ // TODO(rvargas): remove this code. |
+ ActiveEntriesMap::iterator it = active_entries_.find(key); |
+ CHECK(it == active_entries_.end()); |
+ |
ActiveEntry* entry = new ActiveEntry(disk_entry); |
active_entries_[key] = entry; |
return entry; |
@@ -1589,11 +1600,14 @@ |
ActiveEntriesMap::iterator it = |
active_entries_.find(entry->disk_entry->GetKey()); |
- CHECK(it != active_entries_.end()); |
- CHECK(it->second == entry); |
- |
- if (local_entry.will_process_pending_queue || local_entry.doomed || |
- local_entry.writer || readers_size || pending_size) { |
+ if (it == active_entries_.end() || it->second != entry || |
+ local_entry.will_process_pending_queue || local_entry.doomed || |
+ local_entry.writer || readers_size || pending_size || deleted_) { |
+ bool local_mem_flag = in_memory_cache_; |
+ ActiveEntriesSet::iterator it2 = doomed_entries_.find(entry); |
+ CHECK(it2 == doomed_entries_.end()); |
+ CHECK(!deleted_); |
+ CHECK(local_mem_flag); |
CHECK(false); |
} |
@@ -1645,6 +1659,11 @@ |
return trans->EntryAvailable(entry); |
} |
+#if defined(OS_WIN) |
+#pragma optimize("", off) |
+#pragma warning(disable:4748) |
+#endif |
+// Avoid optimizing local_transaction out of the code. |
void HttpCache::DoneWithEntry(ActiveEntry* entry, Transaction* trans) { |
// If we already posted a task to move on to the next transaction and this was |
// the writer, there is nothing to cancel. |
@@ -1654,12 +1673,21 @@ |
if (entry->writer) { |
// TODO(rvargas): convert this to a DCHECK. |
CHECK(trans == entry->writer); |
+ // Get a local copy of the transaction, in preparation for a crash inside |
+ // DeactivateEntry. |
+ char local_transaction[sizeof(*trans)]; |
+ memcpy(local_transaction, trans, sizeof(*trans)); |
+ |
// Assume that this is not a successful write. |
DoneWritingToEntry(entry, false); |
} else { |
DoneReadingFromEntry(entry, trans); |
} |
} |
+#if defined(OS_WIN) |
+#pragma warning(default:4748) |
+#pragma optimize("", on) |
+#endif |
void HttpCache::DoneWritingToEntry(ActiveEntry* entry, bool success) { |
DCHECK(entry->readers.empty()); |