Chromium Code Reviews| Index: net/http/mock_http_cache.cc |
| diff --git a/net/http/mock_http_cache.cc b/net/http/mock_http_cache.cc |
| index 5363d3af29dd0067ce58b9cd9489b40f2b545b16..eea29d0a4d866223d752131221f543fb207e9747 100644 |
| --- a/net/http/mock_http_cache.cc |
| +++ b/net/http/mock_http_cache.cc |
| @@ -74,7 +74,8 @@ MockDiskEntry::MockDiskEntry(const std::string& key) |
| fail_sparse_requests_(false), |
| busy_(false), |
| delayed_(false), |
| - cancel_(false) { |
| + cancel_(false), |
| + resume_return_code_(0) { |
| test_mode_ = GetTestModeForEntry(key); |
| } |
| @@ -125,10 +126,32 @@ int MockDiskEntry::ReadData(int index, |
| if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ) |
| return num; |
| + // Pause and resume. |
| + if (!before_cache_callback_.is_null()) { |
| + bool defer = false; |
| + before_cache_callback_.Run(&defer); |
| + if (defer) { |
| + resume_callback_ = callback; |
| + resume_return_code_ = num; |
| + return ERR_IO_PENDING; |
| + } |
| + } |
|
jkarlin
2017/07/07 19:12:39
This seems overly complex for our use case. Why no
jkarlin
2017/07/07 19:14:12
Note that this comment came before I added the sug
shivanisha
2017/07/10 18:51:27
Simplified by using an enum DeferOp.
|
| + |
| CallbackLater(callback, num); |
| return ERR_IO_PENDING; |
| } |
| +int MockDiskEntry::ResumeCacheOperation() { |
| + DCHECK(!resume_callback_.is_null()); |
| + CallbackLater(resume_callback_, resume_return_code_); |
| + return ERR_IO_PENDING; |
| +} |
| + |
| +void MockDiskEntry::SetBeforeCacheOperationCallback( |
| + const BeforeCacheOperationCallback& callback) { |
| + before_cache_callback_ = callback; |
| +} |
| + |
| int MockDiskEntry::WriteData(int index, |
| int offset, |
| IOBuffer* buf, |
| @@ -399,7 +422,7 @@ int MockDiskCache::OpenEntry(const std::string& key, |
| return ERR_CACHE_OPEN_FAILURE; |
| if (it->second->is_doomed()) { |
| - it->second->Release(); |
| + doomed_entries_[key] = it->second; |
| entries_.erase(it); |
| return ERR_CACHE_OPEN_FAILURE; |
| } |
| @@ -434,7 +457,7 @@ int MockDiskCache::CreateEntry(const std::string& key, |
| else |
| return ERR_CACHE_CREATE_FAILURE; |
| } |
| - it->second->Release(); |
| + doomed_entries_[key] = it->second; |
| entries_.erase(it); |
| } |
| @@ -466,7 +489,7 @@ int MockDiskCache::DoomEntry(const std::string& key, |
| DCHECK(!callback.is_null()); |
| EntryMap::iterator it = entries_.find(key); |
| if (it != entries_.end()) { |
| - it->second->Release(); |
| + doomed_entries_[key] = it->second; |
| entries_.erase(it); |
| } |
| @@ -522,10 +545,13 @@ size_t MockDiskCache::DumpMemoryStats( |
| } |
| void MockDiskCache::ReleaseAll() { |
| - EntryMap::iterator it = entries_.begin(); |
| - for (; it != entries_.end(); ++it) |
| - it->second->Release(); |
| + for (auto entry : entries_) |
| + entry.second->Release(); |
| entries_.clear(); |
| + |
| + for (auto doomed : doomed_entries_) |
| + doomed.second->Release(); |
| + doomed_entries_.clear(); |
| } |
| void MockDiskCache::CallbackLater(const CompletionCallback& callback, |
| @@ -535,10 +561,46 @@ void MockDiskCache::CallbackLater(const CompletionCallback& callback, |
| } |
| bool MockDiskCache::IsDiskEntryDoomed(const std::string& key) { |
| + auto doomed_it = doomed_entries_.find(key); |
| + if (doomed_it != doomed_entries_.end()) |
| + return true; |
| + |
| + auto it = entries_.find(key); |
| + if (it != entries_.end()) |
| + return it->second->is_doomed(); |
| + |
| + return false; |
| +} |
| + |
| +void MockDiskCache::SetBeforeCacheOperationCallback( |
| + const std::string& key, |
| + const MockDiskEntry::BeforeCacheOperationCallback& callback) { |
| auto it = entries_.find(key); |
| if (it == entries_.end()) |
| - return false; |
| - return it->second->is_doomed(); |
| + return; |
| + it->second->SetBeforeCacheOperationCallback(callback); |
| +} |
| + |
| +int MockDiskCache::ResumeCacheOperation(const std::string& key) { |
| + auto it = entries_.find(key); |
| + if (it != entries_.end()) |
| + return it->second->ResumeCacheOperation(); |
| + |
| + return ERR_UNEXPECTED; |
| +} |
| + |
| +int MockDiskCache::ResumeDoomedEntryCacheOperation(const std::string& key) { |
| + auto doomed_it = doomed_entries_.find(key); |
| + if (doomed_it != doomed_entries_.end()) |
| + return doomed_it->second->ResumeCacheOperation(); |
| + |
| + auto it = entries_.find(key); |
| + if (it != entries_.end()) { |
| + DCHECK(it->second->is_doomed()); |
| + return it->second->ResumeCacheOperation(); |
| + } |
| + |
| + return ERR_UNEXPECTED; |
| } |
| //----------------------------------------------------------------------------- |