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 59a82085f8f268df0e99e330369c0642d2497126..a39721a26ef077a852e1a29b8e996089a51833fc 100644 |
--- a/components/cronet/ios/cronet_bidirectional_stream.cc |
+++ b/components/cronet/ios/cronet_bidirectional_stream.cc |
@@ -73,7 +73,10 @@ CronetBidirectionalStream::CronetBidirectionalStream( |
pending_write_data_(new WriteBuffers()), |
flushing_write_data_(new WriteBuffers()), |
sending_write_data_(new WriteBuffers()), |
- delegate_(delegate) {} |
+ delegate_(delegate), |
+ weak_factory_(this) { |
+ weak_this_ = weak_factory_.GetWeakPtr(); |
+} |
CronetBidirectionalStream::~CronetBidirectionalStream() { |
DCHECK(environment_->IsOnNetworkThread()); |
@@ -98,9 +101,8 @@ int CronetBidirectionalStream::Start(const char* url, |
write_end_of_stream_ = end_of_stream; |
DCHECK(environment_); |
environment_->PostToNetworkThread( |
- FROM_HERE, |
- base::Bind(&CronetBidirectionalStream::StartOnNetworkThread, |
- base::Unretained(this), base::Passed(&request_info))); |
+ FROM_HERE, base::Bind(&CronetBidirectionalStream::StartOnNetworkThread, |
+ weak_this_, base::Passed(&request_info))); |
return 0; |
} |
@@ -112,7 +114,7 @@ bool CronetBidirectionalStream::ReadData(char* buffer, int capacity) { |
environment_->PostToNetworkThread( |
FROM_HERE, base::Bind(&CronetBidirectionalStream::ReadDataOnNetworkThread, |
- base::Unretained(this), read_buffer, capacity)); |
+ weak_this_, read_buffer, capacity)); |
return true; |
} |
@@ -128,20 +130,20 @@ bool CronetBidirectionalStream::WriteData(const char* buffer, |
environment_->PostToNetworkThread( |
FROM_HERE, |
base::Bind(&CronetBidirectionalStream::WriteDataOnNetworkThread, |
- base::Unretained(this), write_buffer, count, end_of_stream)); |
+ weak_this_, write_buffer, count, end_of_stream)); |
return true; |
} |
void CronetBidirectionalStream::Flush() { |
environment_->PostToNetworkThread( |
- FROM_HERE, base::Bind(&CronetBidirectionalStream::FlushOnNetworkThread, |
- base::Unretained(this))); |
+ FROM_HERE, |
+ base::Bind(&CronetBidirectionalStream::FlushOnNetworkThread, weak_this_)); |
} |
void CronetBidirectionalStream::Cancel() { |
environment_->PostToNetworkThread( |
FROM_HERE, base::Bind(&CronetBidirectionalStream::CancelOnNetworkThread, |
- base::Unretained(this))); |
+ weak_this_)); |
} |
void CronetBidirectionalStream::Destroy() { |
@@ -234,8 +236,9 @@ void CronetBidirectionalStream::OnTrailersReceived( |
void CronetBidirectionalStream::OnFailed(int error) { |
DCHECK(environment_->IsOnNetworkThread()); |
- bidi_stream_.reset(); |
read_state_ = write_state_ = ERROR; |
+ bidi_stream_.reset(); |
+ weak_factory_.InvalidateWeakPtrs(); |
delegate_->OnFailed(error); |
} |
@@ -327,6 +330,7 @@ void CronetBidirectionalStream::FlushOnNetworkThread() { |
} |
void CronetBidirectionalStream::SendFlushingWriteData() { |
+ DCHECK(bidi_stream_); |
// If previous send is not done, or there is nothing to flush, then exit. |
if (write_state_ == WRITING || flushing_write_data_->Empty()) |
return; |
@@ -344,6 +348,7 @@ void CronetBidirectionalStream::CancelOnNetworkThread() { |
return; |
read_state_ = write_state_ = CANCELED; |
bidi_stream_.reset(); |
+ weak_factory_.InvalidateWeakPtrs(); |
delegate_->OnCanceled(); |
} |
@@ -357,6 +362,7 @@ void CronetBidirectionalStream::MaybeOnSucceded() { |
if (read_state_ == READING_DONE && write_state_ == WRITING_DONE) { |
read_state_ = write_state_ = SUCCESS; |
bidi_stream_.reset(); |
+ weak_factory_.InvalidateWeakPtrs(); |
delegate_->OnSucceeded(); |
} |
} |