Index: net/disk_cache/simple/simple_entry_impl.cc |
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc |
index 68f65dc12f8e1c5e4bf4bac22270844bc943dbb6..14bcee3c949fd0ce21513531c3e9559fd0cfdb13 100644 |
--- a/net/disk_cache/simple/simple_entry_impl.cc |
+++ b/net/disk_cache/simple/simple_entry_impl.cc |
@@ -86,17 +86,12 @@ void SimpleEntryImpl::Doom() { |
} |
void SimpleEntryImpl::Close() { |
- if (synchronous_entry_in_use_by_worker_) { |
- NOTIMPLEMENTED(); |
- delete this; |
- return; |
+ if (!synchronous_entry_in_use_by_worker_) { |
+ WorkerPool::PostTask(FROM_HERE, |
+ base::Bind(&SimpleSynchronousEntry::Close, |
+ base::Unretained(synchronous_entry_)), |
+ true); |
} |
- DCHECK(synchronous_entry_); |
- WorkerPool::PostTask(FROM_HERE, |
- base::Bind(&SimpleSynchronousEntry::Close, |
- base::Unretained(synchronous_entry_)), |
- true); |
- synchronous_entry_ = NULL; |
// Entry::Close() is expected to release this entry. See disk_cache.h for |
// details. |
delete this; |
@@ -125,7 +120,8 @@ int SimpleEntryImpl::ReadData(int index, |
const CompletionCallback& callback) { |
// TODO(gavinp): Add support for overlapping reads. The net::HttpCache does |
// make overlapping read requests when multiple transactions access the same |
- // entry as read only. |
+ // entry as read only. This might make calling SimpleSynchronousEntry::Close() |
+ // correctly more tricky (see SimpleEntryImpl::EntryOperationComplete). |
if (synchronous_entry_in_use_by_worker_) { |
NOTIMPLEMENTED(); |
CHECK(false); |
@@ -133,7 +129,7 @@ int SimpleEntryImpl::ReadData(int index, |
synchronous_entry_in_use_by_worker_ = true; |
SynchronousOperationCallback sync_operation_callback = |
base::Bind(&SimpleEntryImpl::EntryOperationComplete, |
- callback, weak_ptr_factory_.GetWeakPtr()); |
+ callback, weak_ptr_factory_.GetWeakPtr(), synchronous_entry_); |
WorkerPool::PostTask(FROM_HERE, |
base::Bind(&SimpleSynchronousEntry::ReadData, |
base::Unretained(synchronous_entry_), |
@@ -156,7 +152,7 @@ int SimpleEntryImpl::WriteData(int index, |
synchronous_entry_in_use_by_worker_ = true; |
SynchronousOperationCallback sync_operation_callback = |
base::Bind(&SimpleEntryImpl::EntryOperationComplete, |
- callback, weak_ptr_factory_.GetWeakPtr()); |
+ callback, weak_ptr_factory_.GetWeakPtr(), synchronous_entry_); |
WorkerPool::PostTask(FROM_HERE, |
base::Bind(&SimpleSynchronousEntry::WriteData, |
base::Unretained(synchronous_entry_), |
@@ -221,7 +217,6 @@ SimpleEntryImpl::SimpleEntryImpl( |
} |
SimpleEntryImpl::~SimpleEntryImpl() { |
- DCHECK(!synchronous_entry_); |
} |
// static |
@@ -241,11 +236,20 @@ void SimpleEntryImpl::CreationOperationComplete( |
void SimpleEntryImpl::EntryOperationComplete( |
const CompletionCallback& completion_callback, |
base::WeakPtr<SimpleEntryImpl> entry, |
+ SimpleSynchronousEntry* sync_entry, |
int result) { |
if (entry) { |
DCHECK(entry->synchronous_entry_in_use_by_worker_); |
entry->synchronous_entry_in_use_by_worker_ = false; |
entry->SetSynchronousData(); |
+ } else { |
+ // |entry| must have had Close() called while this operation was in flight. |
+ // Since the simple cache now only supports one pending entry operation in |
+ // flight at a time, it's safe to now call Close() on |sync_entry|. |
+ WorkerPool::PostTask(FROM_HERE, |
+ base::Bind(&SimpleSynchronousEntry::Close, |
+ base::Unretained(sync_entry)), |
+ true); |
} |
completion_callback.Run(result); |
} |