| 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 |