OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/byte_stream.h" | 5 #include "content/browser/byte_stream.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 StreamState Read(scoped_refptr<net::IOBuffer>* data, size_t* length) override; | 119 StreamState Read(scoped_refptr<net::IOBuffer>* data, size_t* length) override; |
120 int GetStatus() const override; | 120 int GetStatus() const override; |
121 void RegisterCallback(const base::Closure& sink_callback) override; | 121 void RegisterCallback(const base::Closure& sink_callback) override; |
122 | 122 |
123 // PostTask target from |ByteStreamWriterImpl::Write| and | 123 // PostTask target from |ByteStreamWriterImpl::Write| and |
124 // |ByteStreamWriterImpl::Close|. | 124 // |ByteStreamWriterImpl::Close|. |
125 // Receive data from our peer. | 125 // Receive data from our peer. |
126 // static because it may be called after the object it is targeting | 126 // static because it may be called after the object it is targeting |
127 // has been destroyed. It may not access |*target| | 127 // has been destroyed. It may not access |*target| |
128 // if |*object_lifetime_flag| is false. | 128 // if |*object_lifetime_flag| is false. |
129 static void TransferData( | 129 static void TransferData(scoped_refptr<LifetimeFlag> object_lifetime_flag, |
130 scoped_refptr<LifetimeFlag> object_lifetime_flag, | 130 ByteStreamReaderImpl* target, |
131 ByteStreamReaderImpl* target, | 131 std::unique_ptr<ContentVector> transfer_buffer, |
132 scoped_ptr<ContentVector> transfer_buffer, | 132 size_t transfer_buffer_bytes, |
133 size_t transfer_buffer_bytes, | 133 bool source_complete, |
134 bool source_complete, | 134 int status); |
135 int status); | |
136 | 135 |
137 private: | 136 private: |
138 // Called from TransferData once object existence has been validated. | 137 // Called from TransferData once object existence has been validated. |
139 void TransferDataInternal( | 138 void TransferDataInternal(std::unique_ptr<ContentVector> transfer_buffer, |
140 scoped_ptr<ContentVector> transfer_buffer, | 139 size_t transfer_buffer_bytes, |
141 size_t transfer_buffer_bytes, | 140 bool source_complete, |
142 bool source_complete, | 141 int status); |
143 int status); | |
144 | 142 |
145 void MaybeUpdateInput(); | 143 void MaybeUpdateInput(); |
146 | 144 |
147 const size_t total_buffer_size_; | 145 const size_t total_buffer_size_; |
148 | 146 |
149 scoped_refptr<base::SequencedTaskRunner> my_task_runner_; | 147 scoped_refptr<base::SequencedTaskRunner> my_task_runner_; |
150 | 148 |
151 // True while this object is alive. | 149 // True while this object is alive. |
152 scoped_refptr<LifetimeFlag> my_lifetime_flag_; | 150 scoped_refptr<LifetimeFlag> my_lifetime_flag_; |
153 | 151 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 if (no_longer_above_limit && was_above_limit && | 280 if (no_longer_above_limit && was_above_limit && |
283 !space_available_callback_.is_null()) | 281 !space_available_callback_.is_null()) |
284 space_available_callback_.Run(); | 282 space_available_callback_.Run(); |
285 } | 283 } |
286 | 284 |
287 void ByteStreamWriterImpl::PostToPeer(bool complete, int status) { | 285 void ByteStreamWriterImpl::PostToPeer(bool complete, int status) { |
288 DCHECK(my_task_runner_->RunsTasksOnCurrentThread()); | 286 DCHECK(my_task_runner_->RunsTasksOnCurrentThread()); |
289 // Valid contexts in which to call. | 287 // Valid contexts in which to call. |
290 DCHECK(complete || 0 != input_contents_size_); | 288 DCHECK(complete || 0 != input_contents_size_); |
291 | 289 |
292 scoped_ptr<ContentVector> transfer_buffer; | 290 std::unique_ptr<ContentVector> transfer_buffer; |
293 size_t buffer_size = 0; | 291 size_t buffer_size = 0; |
294 if (0 != input_contents_size_) { | 292 if (0 != input_contents_size_) { |
295 transfer_buffer.reset(new ContentVector); | 293 transfer_buffer.reset(new ContentVector); |
296 transfer_buffer->swap(input_contents_); | 294 transfer_buffer->swap(input_contents_); |
297 buffer_size = input_contents_size_; | 295 buffer_size = input_contents_size_; |
298 output_size_used_ += input_contents_size_; | 296 output_size_used_ += input_contents_size_; |
299 input_contents_size_ = 0; | 297 input_contents_size_ = 0; |
300 } | 298 } |
301 peer_task_runner_->PostTask( | 299 peer_task_runner_->PostTask( |
302 FROM_HERE, base::Bind( | 300 FROM_HERE, base::Bind( |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 const base::Closure& sink_callback) { | 368 const base::Closure& sink_callback) { |
371 DCHECK(my_task_runner_->RunsTasksOnCurrentThread()); | 369 DCHECK(my_task_runner_->RunsTasksOnCurrentThread()); |
372 | 370 |
373 data_available_callback_ = sink_callback; | 371 data_available_callback_ = sink_callback; |
374 } | 372 } |
375 | 373 |
376 // static | 374 // static |
377 void ByteStreamReaderImpl::TransferData( | 375 void ByteStreamReaderImpl::TransferData( |
378 scoped_refptr<LifetimeFlag> object_lifetime_flag, | 376 scoped_refptr<LifetimeFlag> object_lifetime_flag, |
379 ByteStreamReaderImpl* target, | 377 ByteStreamReaderImpl* target, |
380 scoped_ptr<ContentVector> transfer_buffer, | 378 std::unique_ptr<ContentVector> transfer_buffer, |
381 size_t buffer_size, | 379 size_t buffer_size, |
382 bool source_complete, | 380 bool source_complete, |
383 int status) { | 381 int status) { |
384 // If our target is no longer alive, do nothing. | 382 // If our target is no longer alive, do nothing. |
385 if (!object_lifetime_flag->is_alive) return; | 383 if (!object_lifetime_flag->is_alive) return; |
386 | 384 |
387 target->TransferDataInternal(std::move(transfer_buffer), buffer_size, | 385 target->TransferDataInternal(std::move(transfer_buffer), buffer_size, |
388 source_complete, status); | 386 source_complete, status); |
389 } | 387 } |
390 | 388 |
391 void ByteStreamReaderImpl::TransferDataInternal( | 389 void ByteStreamReaderImpl::TransferDataInternal( |
392 scoped_ptr<ContentVector> transfer_buffer, | 390 std::unique_ptr<ContentVector> transfer_buffer, |
393 size_t buffer_size, | 391 size_t buffer_size, |
394 bool source_complete, | 392 bool source_complete, |
395 int status) { | 393 int status) { |
396 DCHECK(my_task_runner_->RunsTasksOnCurrentThread()); | 394 DCHECK(my_task_runner_->RunsTasksOnCurrentThread()); |
397 | 395 |
398 bool was_empty = available_contents_.empty(); | 396 bool was_empty = available_contents_.empty(); |
399 | 397 |
400 if (transfer_buffer) { | 398 if (transfer_buffer) { |
401 available_contents_.insert(available_contents_.end(), | 399 available_contents_.insert(available_contents_.end(), |
402 transfer_buffer->begin(), | 400 transfer_buffer->begin(), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 const int ByteStreamReader::kFractionReadBeforeWindowUpdate = 3; | 439 const int ByteStreamReader::kFractionReadBeforeWindowUpdate = 3; |
442 | 440 |
443 ByteStreamReader::~ByteStreamReader() { } | 441 ByteStreamReader::~ByteStreamReader() { } |
444 | 442 |
445 ByteStreamWriter::~ByteStreamWriter() { } | 443 ByteStreamWriter::~ByteStreamWriter() { } |
446 | 444 |
447 void CreateByteStream( | 445 void CreateByteStream( |
448 scoped_refptr<base::SequencedTaskRunner> input_task_runner, | 446 scoped_refptr<base::SequencedTaskRunner> input_task_runner, |
449 scoped_refptr<base::SequencedTaskRunner> output_task_runner, | 447 scoped_refptr<base::SequencedTaskRunner> output_task_runner, |
450 size_t buffer_size, | 448 size_t buffer_size, |
451 scoped_ptr<ByteStreamWriter>* input, | 449 std::unique_ptr<ByteStreamWriter>* input, |
452 scoped_ptr<ByteStreamReader>* output) { | 450 std::unique_ptr<ByteStreamReader>* output) { |
453 scoped_refptr<LifetimeFlag> input_flag(new LifetimeFlag()); | 451 scoped_refptr<LifetimeFlag> input_flag(new LifetimeFlag()); |
454 scoped_refptr<LifetimeFlag> output_flag(new LifetimeFlag()); | 452 scoped_refptr<LifetimeFlag> output_flag(new LifetimeFlag()); |
455 | 453 |
456 ByteStreamWriterImpl* in = new ByteStreamWriterImpl( | 454 ByteStreamWriterImpl* in = new ByteStreamWriterImpl( |
457 input_task_runner, input_flag, buffer_size); | 455 input_task_runner, input_flag, buffer_size); |
458 ByteStreamReaderImpl* out = new ByteStreamReaderImpl( | 456 ByteStreamReaderImpl* out = new ByteStreamReaderImpl( |
459 output_task_runner, output_flag, buffer_size); | 457 output_task_runner, output_flag, buffer_size); |
460 | 458 |
461 in->SetPeer(out, output_task_runner, output_flag); | 459 in->SetPeer(out, output_task_runner, output_flag); |
462 out->SetPeer(in, input_task_runner, input_flag); | 460 out->SetPeer(in, input_task_runner, input_flag); |
463 input->reset(in); | 461 input->reset(in); |
464 output->reset(out); | 462 output->reset(out); |
465 } | 463 } |
466 | 464 |
467 } // namespace content | 465 } // namespace content |
OLD | NEW |