Index: net/http/disk_cache_based_quic_server_info.cc |
diff --git a/net/http/disk_cache_based_quic_server_info.cc b/net/http/disk_cache_based_quic_server_info.cc |
index aa322ab3f08079a351377e9fe4c948a6a0c025bd..91625bc973cec0eee0174c9348fd858d127212f2 100644 |
--- a/net/http/disk_cache_based_quic_server_info.cc |
+++ b/net/http/disk_cache_based_quic_server_info.cc |
@@ -70,22 +70,29 @@ void DiskCacheBasedQuicServerInfo::Start() { |
int DiskCacheBasedQuicServerInfo::WaitForDataReady( |
const CompletionCallback& callback) { |
DCHECK(CalledOnValidThread()); |
- DCHECK(state_ != GET_BACKEND); |
+ DCHECK_NE(GET_BACKEND, state_); |
if (ready_) |
return OK; |
if (!callback.is_null()) { |
- DCHECK(user_callback_.is_null()); |
+ // Prevent a new callback for WaitForDataReady overwriting an existing |
+ // pending callback (|user_callback_|). |
+ if (!user_callback_.is_null()) |
+ return ERR_INVALID_ARGUMENT; |
user_callback_ = callback; |
} |
return ERR_IO_PENDING; |
} |
+bool DiskCacheBasedQuicServerInfo::IsDataReady() { |
+ return ready_; |
+} |
+ |
void DiskCacheBasedQuicServerInfo::Persist() { |
DCHECK(CalledOnValidThread()); |
- DCHECK(state_ != GET_BACKEND); |
+ DCHECK_NE(GET_BACKEND, state_); |
DCHECK(new_data_.empty()); |
CHECK(ready_); |
@@ -111,6 +118,7 @@ std::string DiskCacheBasedQuicServerInfo::key() const { |
void DiskCacheBasedQuicServerInfo::OnIOComplete(CacheOperationDataShim* unused, |
int rv) { |
+ DCHECK_NE(NONE, state_); |
rv = DoLoop(rv); |
if (rv != ERR_IO_PENDING && !user_callback_.is_null()) { |
CompletionCallback callback = user_callback_; |
@@ -272,6 +280,7 @@ int DiskCacheBasedQuicServerInfo::DoSetDone() { |
if (entry_) |
entry_->Close(); |
entry_ = NULL; |
+ new_data_.clear(); |
state_ = NONE; |
return OK; |
} |