Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Unified Diff: components/cronet/ios/cronet_bidirectional_stream.cc

Issue 2371053003: [Cronet] Delete bidi stream asynchronously in OnFailed and MaybeOnSucceeded callbacks on iOS. (Closed)
Patch Set: Address Andrei's comments. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | components/cronet/ios/cronet_c_for_grpc.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/cronet/ios/cronet_bidirectional_stream.cc
diff --git a/components/cronet/ios/cronet_bidirectional_stream.cc b/components/cronet/ios/cronet_bidirectional_stream.cc
index a39721a26ef077a852e1a29b8e996089a51833fc..234d96feb89612c913cdee2baeb0c3b35c669293 100644
--- a/components/cronet/ios/cronet_bidirectional_stream.cc
+++ b/components/cronet/ios/cronet_bidirectional_stream.cc
@@ -158,6 +158,8 @@ void CronetBidirectionalStream::Destroy() {
void CronetBidirectionalStream::OnStreamReady(bool request_headers_sent) {
DCHECK(environment_->IsOnNetworkThread());
DCHECK_EQ(STARTED, write_state_);
+ if (!bidi_stream_)
+ return;
request_headers_sent_ = request_headers_sent;
write_state_ = WAITING_FOR_FLUSH;
if (write_end_of_stream_) {
@@ -175,6 +177,8 @@ void CronetBidirectionalStream::OnHeadersReceived(
const net::SpdyHeaderBlock& response_headers) {
DCHECK(environment_->IsOnNetworkThread());
DCHECK_EQ(STARTED, read_state_);
+ if (!bidi_stream_)
+ return;
read_state_ = WAITING_FOR_READ;
// Get http status code from response headers.
int http_status_code = 0;
@@ -198,6 +202,8 @@ void CronetBidirectionalStream::OnHeadersReceived(
void CronetBidirectionalStream::OnDataRead(int bytes_read) {
DCHECK(environment_->IsOnNetworkThread());
DCHECK_EQ(READING, read_state_);
+ if (!bidi_stream_)
+ return;
read_state_ = WAITING_FOR_READ;
delegate_->OnDataRead(read_buffer_->data(), bytes_read);
@@ -210,6 +216,8 @@ void CronetBidirectionalStream::OnDataRead(int bytes_read) {
void CronetBidirectionalStream::OnDataSent() {
DCHECK(environment_->IsOnNetworkThread());
+ if (!bidi_stream_)
+ return;
DCHECK_EQ(WRITING, write_state_);
write_state_ = WAITING_FOR_FLUSH;
for (const scoped_refptr<net::IOBuffer>& buffer :
@@ -231,14 +239,21 @@ void CronetBidirectionalStream::OnDataSent() {
void CronetBidirectionalStream::OnTrailersReceived(
const net::SpdyHeaderBlock& response_trailers) {
DCHECK(environment_->IsOnNetworkThread());
+ if (!bidi_stream_)
+ return;
delegate_->OnTrailersReceived(response_trailers);
}
void CronetBidirectionalStream::OnFailed(int error) {
DCHECK(environment_->IsOnNetworkThread());
+ if (!bidi_stream_ && read_state_ != NOT_STARTED)
+ return;
read_state_ = write_state_ = ERROR;
- bidi_stream_.reset();
weak_factory_.InvalidateWeakPtrs();
+ // Delete underlying |bidi_stream_| asynchronously as it may still be used.
+ environment_->PostToNetworkThread(
+ FROM_HERE, base::Bind(&base::DeletePointer<net::BidirectionalStream>,
+ bidi_stream_.release()));
delegate_->OnFailed(error);
}
@@ -265,7 +280,7 @@ void CronetBidirectionalStream::ReadDataOnNetworkThread(
DCHECK(read_buffer);
DCHECK(!read_buffer_);
if (read_state_ != WAITING_FOR_READ) {
- DLOG(ERROR) << "Unexpected Read Data in read_state " << WAITING_FOR_READ;
+ DLOG(ERROR) << "Unexpected Read Data in read_state " << read_state_;
// Invoke OnFailed unless it is already invoked.
if (read_state_ != ERROR)
OnFailed(net::ERR_UNEXPECTED);
@@ -359,10 +374,15 @@ void CronetBidirectionalStream::DestroyOnNetworkThread() {
void CronetBidirectionalStream::MaybeOnSucceded() {
DCHECK(environment_->IsOnNetworkThread());
+ if (!bidi_stream_)
+ return;
if (read_state_ == READING_DONE && write_state_ == WRITING_DONE) {
read_state_ = write_state_ = SUCCESS;
- bidi_stream_.reset();
weak_factory_.InvalidateWeakPtrs();
+ // Delete underlying |bidi_stream_| asynchronously as it may still be used.
+ environment_->PostToNetworkThread(
+ FROM_HERE, base::Bind(&base::DeletePointer<net::BidirectionalStream>,
+ bidi_stream_.release()));
delegate_->OnSucceeded();
}
}
« no previous file with comments | « no previous file | components/cronet/ios/cronet_c_for_grpc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698