| Index: net/http/http_cache_transaction.h | 
| diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h | 
| index 51c0db70256cbd31505ca20ffba6486ab4c36aad..3603755a0b33a566fccda65df144478c4bfde563 100644 | 
| --- a/net/http/http_cache_transaction.h | 
| +++ b/net/http/http_cache_transaction.h | 
| @@ -164,6 +164,10 @@ class HttpCache::Transaction : public HttpTransaction { | 
| int ResumeNetworkStart() override; | 
| void GetConnectionAttempts(ConnectionAttempts* out) const override; | 
|  | 
| +  // Invoked when parallel validation cannot proceed due to response failure | 
| +  // and this transaction needs to be restarted. | 
| +  void SetValidatingCannotProceed(); | 
| + | 
| // Returns the estimate of dynamically allocated memory in bytes. | 
| size_t EstimateMemoryUsage() const; | 
|  | 
| @@ -220,6 +224,9 @@ class HttpCache::Transaction : public HttpTransaction { | 
| STATE_PARTIAL_HEADERS_RECEIVED, | 
| STATE_CACHE_READ_METADATA, | 
| STATE_CACHE_READ_METADATA_COMPLETE, | 
| +    STATE_HEADERS_PHASE_CANNOT_PROCEED, | 
| +    STATE_FINISH_HEADERS, | 
| +    STATE_FINISH_HEADERS_COMPLETE, | 
|  | 
| // These states are entered from Read/AddTruncatedFlag. | 
| STATE_NETWORK_READ, | 
| @@ -251,6 +258,11 @@ class HttpCache::Transaction : public HttpTransaction { | 
| // Each of these methods corresponds to a State value.  If there is an | 
| // argument, the value corresponds to the return of the previous state or | 
| // corresponding callback. | 
| +  // | 
| +  // Note that since headers and response body phases might be going on in | 
| +  // parallel for two transactions, a transaction in one phase should not be | 
| +  // accessing disk entry fields of the other index as that might lead to data | 
| +  // races in some backends (like block file cache). | 
| int DoGetBackend(); | 
| int DoGetBackendComplete(int result); | 
| int DoInitEntry(); | 
| @@ -288,6 +300,9 @@ class HttpCache::Transaction : public HttpTransaction { | 
| int DoPartialHeadersReceived(); | 
| int DoCacheReadMetadata(); | 
| int DoCacheReadMetadataComplete(int result); | 
| +  int DoHeadersPhaseCannotProceed(); | 
| +  int DoFinishHeaders(int result); | 
| +  int DoFinishHeadersComplete(int result); | 
| int DoNetworkRead(); | 
| int DoNetworkReadComplete(int result); | 
| int DoCacheReadData(); | 
| @@ -430,7 +445,12 @@ class HttpCache::Transaction : public HttpTransaction { | 
| void SyncCacheEntryStatusToResponse(); | 
| void RecordHistograms(); | 
|  | 
| -  // Called to signal completion of asynchronous IO. | 
| +  // Called to signal completion of asynchronous IO. Note that this callback is | 
| +  // used in the conventional sense where one layer calls the callback of the | 
| +  // layer above it e.g. this callback gets called from the network transaction | 
| +  // layer. In addition, it is also used for HttpCache layer to let this | 
| +  // transaction know when it is out of a queued state in ActiveEntry and can | 
| +  // continue its processing. | 
| void OnIOComplete(int result); | 
|  | 
| // When in a DoLoop, use this to set the next state as it verifies that the | 
| @@ -456,6 +476,7 @@ class HttpCache::Transaction : public HttpTransaction { | 
| const HttpResponseInfo* new_response_; | 
| std::string cache_key_; | 
| Mode mode_; | 
| +  Mode original_mode_;  // Used when restarting the transaction. | 
| bool reading_;  // We are already reading. Never reverts to false once set. | 
| bool invalid_range_;  // We may bypass the cache for this request. | 
| bool truncated_;  // We don't have all the response data. | 
|  |