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

Side by Side Diff: components/cronet/ios/cronet_bidirectional_stream.cc

Issue 2369053002: [Cronet] Use WeakPtr in CronetBidirectionalStream on iOS. (Closed)
Patch Set: Remove build/config/sanitizers/BUILD.gn changes. Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/cronet/ios/cronet_bidirectional_stream.h" 5 #include "components/cronet/ios/cronet_bidirectional_stream.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 : read_state_(NOT_STARTED), 66 : read_state_(NOT_STARTED),
67 write_state_(NOT_STARTED), 67 write_state_(NOT_STARTED),
68 write_end_of_stream_(false), 68 write_end_of_stream_(false),
69 request_headers_sent_(false), 69 request_headers_sent_(false),
70 disable_auto_flush_(false), 70 disable_auto_flush_(false),
71 delay_headers_until_flush_(false), 71 delay_headers_until_flush_(false),
72 environment_(environment), 72 environment_(environment),
73 pending_write_data_(new WriteBuffers()), 73 pending_write_data_(new WriteBuffers()),
74 flushing_write_data_(new WriteBuffers()), 74 flushing_write_data_(new WriteBuffers()),
75 sending_write_data_(new WriteBuffers()), 75 sending_write_data_(new WriteBuffers()),
76 delegate_(delegate) {} 76 delegate_(delegate),
77 weak_factory_(this) {
78 weak_this_ = weak_factory_.GetWeakPtr();
79 }
77 80
78 CronetBidirectionalStream::~CronetBidirectionalStream() { 81 CronetBidirectionalStream::~CronetBidirectionalStream() {
79 DCHECK(environment_->IsOnNetworkThread()); 82 DCHECK(environment_->IsOnNetworkThread());
80 } 83 }
81 84
82 int CronetBidirectionalStream::Start(const char* url, 85 int CronetBidirectionalStream::Start(const char* url,
83 int priority, 86 int priority,
84 const char* method, 87 const char* method,
85 const net::HttpRequestHeaders& headers, 88 const net::HttpRequestHeaders& headers,
86 bool end_of_stream) { 89 bool end_of_stream) {
87 // Prepare request info here to be able to return the error. 90 // Prepare request info here to be able to return the error.
88 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info( 91 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info(
89 new net::BidirectionalStreamRequestInfo()); 92 new net::BidirectionalStreamRequestInfo());
90 request_info->url = GURL(url); 93 request_info->url = GURL(url);
91 request_info->priority = static_cast<net::RequestPriority>(priority); 94 request_info->priority = static_cast<net::RequestPriority>(priority);
92 // Http method is a token, just as header name. 95 // Http method is a token, just as header name.
93 request_info->method = method; 96 request_info->method = method;
94 if (!net::HttpUtil::IsValidHeaderName(request_info->method)) 97 if (!net::HttpUtil::IsValidHeaderName(request_info->method))
95 return -1; 98 return -1;
96 request_info->extra_headers.CopyFrom(headers); 99 request_info->extra_headers.CopyFrom(headers);
97 request_info->end_stream_on_headers = end_of_stream; 100 request_info->end_stream_on_headers = end_of_stream;
98 write_end_of_stream_ = end_of_stream; 101 write_end_of_stream_ = end_of_stream;
99 DCHECK(environment_); 102 DCHECK(environment_);
100 environment_->PostToNetworkThread( 103 environment_->PostToNetworkThread(
101 FROM_HERE, 104 FROM_HERE, base::Bind(&CronetBidirectionalStream::StartOnNetworkThread,
102 base::Bind(&CronetBidirectionalStream::StartOnNetworkThread, 105 weak_this_, base::Passed(&request_info)));
103 base::Unretained(this), base::Passed(&request_info)));
104 return 0; 106 return 0;
105 } 107 }
106 108
107 bool CronetBidirectionalStream::ReadData(char* buffer, int capacity) { 109 bool CronetBidirectionalStream::ReadData(char* buffer, int capacity) {
108 if (!buffer) 110 if (!buffer)
109 return false; 111 return false;
110 scoped_refptr<net::WrappedIOBuffer> read_buffer( 112 scoped_refptr<net::WrappedIOBuffer> read_buffer(
111 new net::WrappedIOBuffer(buffer)); 113 new net::WrappedIOBuffer(buffer));
112 114
113 environment_->PostToNetworkThread( 115 environment_->PostToNetworkThread(
114 FROM_HERE, base::Bind(&CronetBidirectionalStream::ReadDataOnNetworkThread, 116 FROM_HERE, base::Bind(&CronetBidirectionalStream::ReadDataOnNetworkThread,
115 base::Unretained(this), read_buffer, capacity)); 117 weak_this_, read_buffer, capacity));
116 return true; 118 return true;
117 } 119 }
118 120
119 bool CronetBidirectionalStream::WriteData(const char* buffer, 121 bool CronetBidirectionalStream::WriteData(const char* buffer,
120 int count, 122 int count,
121 bool end_of_stream) { 123 bool end_of_stream) {
122 if (!buffer) 124 if (!buffer)
123 return false; 125 return false;
124 126
125 scoped_refptr<net::WrappedIOBuffer> write_buffer( 127 scoped_refptr<net::WrappedIOBuffer> write_buffer(
126 new net::WrappedIOBuffer(buffer)); 128 new net::WrappedIOBuffer(buffer));
127 129
128 environment_->PostToNetworkThread( 130 environment_->PostToNetworkThread(
129 FROM_HERE, 131 FROM_HERE,
130 base::Bind(&CronetBidirectionalStream::WriteDataOnNetworkThread, 132 base::Bind(&CronetBidirectionalStream::WriteDataOnNetworkThread,
131 base::Unretained(this), write_buffer, count, end_of_stream)); 133 weak_this_, write_buffer, count, end_of_stream));
132 return true; 134 return true;
133 } 135 }
134 136
135 void CronetBidirectionalStream::Flush() { 137 void CronetBidirectionalStream::Flush() {
136 environment_->PostToNetworkThread( 138 environment_->PostToNetworkThread(
137 FROM_HERE, base::Bind(&CronetBidirectionalStream::FlushOnNetworkThread, 139 FROM_HERE,
138 base::Unretained(this))); 140 base::Bind(&CronetBidirectionalStream::FlushOnNetworkThread, weak_this_));
139 } 141 }
140 142
141 void CronetBidirectionalStream::Cancel() { 143 void CronetBidirectionalStream::Cancel() {
142 environment_->PostToNetworkThread( 144 environment_->PostToNetworkThread(
143 FROM_HERE, base::Bind(&CronetBidirectionalStream::CancelOnNetworkThread, 145 FROM_HERE, base::Bind(&CronetBidirectionalStream::CancelOnNetworkThread,
144 base::Unretained(this))); 146 weak_this_));
145 } 147 }
146 148
147 void CronetBidirectionalStream::Destroy() { 149 void CronetBidirectionalStream::Destroy() {
148 // Destroy could be called from any thread, including network thread (if 150 // Destroy could be called from any thread, including network thread (if
149 // posting task to executor throws an exception), but is posted, so |this| 151 // posting task to executor throws an exception), but is posted, so |this|
150 // is valid until calling task is complete. 152 // is valid until calling task is complete.
151 environment_->PostToNetworkThread( 153 environment_->PostToNetworkThread(
152 FROM_HERE, base::Bind(&CronetBidirectionalStream::DestroyOnNetworkThread, 154 FROM_HERE, base::Bind(&CronetBidirectionalStream::DestroyOnNetworkThread,
153 base::Unretained(this))); 155 base::Unretained(this)));
154 } 156 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 } 229 }
228 230
229 void CronetBidirectionalStream::OnTrailersReceived( 231 void CronetBidirectionalStream::OnTrailersReceived(
230 const net::SpdyHeaderBlock& response_trailers) { 232 const net::SpdyHeaderBlock& response_trailers) {
231 DCHECK(environment_->IsOnNetworkThread()); 233 DCHECK(environment_->IsOnNetworkThread());
232 delegate_->OnTrailersReceived(response_trailers); 234 delegate_->OnTrailersReceived(response_trailers);
233 } 235 }
234 236
235 void CronetBidirectionalStream::OnFailed(int error) { 237 void CronetBidirectionalStream::OnFailed(int error) {
236 DCHECK(environment_->IsOnNetworkThread()); 238 DCHECK(environment_->IsOnNetworkThread());
239 read_state_ = write_state_ = ERROR;
237 bidi_stream_.reset(); 240 bidi_stream_.reset();
238 read_state_ = write_state_ = ERROR; 241 weak_factory_.InvalidateWeakPtrs();
239 delegate_->OnFailed(error); 242 delegate_->OnFailed(error);
240 } 243 }
241 244
242 void CronetBidirectionalStream::StartOnNetworkThread( 245 void CronetBidirectionalStream::StartOnNetworkThread(
243 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info) { 246 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info) {
244 DCHECK(environment_->IsOnNetworkThread()); 247 DCHECK(environment_->IsOnNetworkThread());
245 DCHECK(!bidi_stream_); 248 DCHECK(!bidi_stream_);
246 DCHECK(environment_->GetURLRequestContext()); 249 DCHECK(environment_->GetURLRequestContext());
247 request_info->extra_headers.SetHeaderIfMissing( 250 request_info->extra_headers.SetHeaderIfMissing(
248 net::HttpRequestHeaders::kUserAgent, environment_->user_agent()); 251 net::HttpRequestHeaders::kUserAgent, environment_->user_agent());
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 request_headers_sent_ = true; 323 request_headers_sent_ = true;
321 324
322 // Move pending data to the flushing list. 325 // Move pending data to the flushing list.
323 pending_write_data_->MoveTo(flushing_write_data_.get()); 326 pending_write_data_->MoveTo(flushing_write_data_.get());
324 DCHECK(pending_write_data_->Empty()); 327 DCHECK(pending_write_data_->Empty());
325 if (write_state_ != WRITING) 328 if (write_state_ != WRITING)
326 SendFlushingWriteData(); 329 SendFlushingWriteData();
327 } 330 }
328 331
329 void CronetBidirectionalStream::SendFlushingWriteData() { 332 void CronetBidirectionalStream::SendFlushingWriteData() {
333 DCHECK(bidi_stream_);
330 // If previous send is not done, or there is nothing to flush, then exit. 334 // If previous send is not done, or there is nothing to flush, then exit.
331 if (write_state_ == WRITING || flushing_write_data_->Empty()) 335 if (write_state_ == WRITING || flushing_write_data_->Empty())
332 return; 336 return;
333 DCHECK(sending_write_data_->Empty()); 337 DCHECK(sending_write_data_->Empty());
334 write_state_ = WRITING; 338 write_state_ = WRITING;
335 flushing_write_data_->MoveTo(sending_write_data_.get()); 339 flushing_write_data_->MoveTo(sending_write_data_.get());
336 bidi_stream_->SendvData(sending_write_data_->buffers(), 340 bidi_stream_->SendvData(sending_write_data_->buffers(),
337 sending_write_data_->lengths(), 341 sending_write_data_->lengths(),
338 write_end_of_stream_ && pending_write_data_->Empty()); 342 write_end_of_stream_ && pending_write_data_->Empty());
339 } 343 }
340 344
341 void CronetBidirectionalStream::CancelOnNetworkThread() { 345 void CronetBidirectionalStream::CancelOnNetworkThread() {
342 DCHECK(environment_->IsOnNetworkThread()); 346 DCHECK(environment_->IsOnNetworkThread());
343 if (!bidi_stream_) 347 if (!bidi_stream_)
344 return; 348 return;
345 read_state_ = write_state_ = CANCELED; 349 read_state_ = write_state_ = CANCELED;
346 bidi_stream_.reset(); 350 bidi_stream_.reset();
351 weak_factory_.InvalidateWeakPtrs();
347 delegate_->OnCanceled(); 352 delegate_->OnCanceled();
348 } 353 }
349 354
350 void CronetBidirectionalStream::DestroyOnNetworkThread() { 355 void CronetBidirectionalStream::DestroyOnNetworkThread() {
351 DCHECK(environment_->IsOnNetworkThread()); 356 DCHECK(environment_->IsOnNetworkThread());
352 delete this; 357 delete this;
353 } 358 }
354 359
355 void CronetBidirectionalStream::MaybeOnSucceded() { 360 void CronetBidirectionalStream::MaybeOnSucceded() {
356 DCHECK(environment_->IsOnNetworkThread()); 361 DCHECK(environment_->IsOnNetworkThread());
357 if (read_state_ == READING_DONE && write_state_ == WRITING_DONE) { 362 if (read_state_ == READING_DONE && write_state_ == WRITING_DONE) {
358 read_state_ = write_state_ = SUCCESS; 363 read_state_ = write_state_ = SUCCESS;
359 bidi_stream_.reset(); 364 bidi_stream_.reset();
365 weak_factory_.InvalidateWeakPtrs();
360 delegate_->OnSucceeded(); 366 delegate_->OnSucceeded();
361 } 367 }
362 } 368 }
363 369
364 } // namespace cronet 370 } // namespace cronet
OLDNEW
« no previous file with comments | « components/cronet/ios/cronet_bidirectional_stream.h ('k') | components/cronet/ios/test/cronet_bidirectional_stream_test.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698