OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/child/shared_memory_data_consumer_handle.h" | 5 #include "content/child/shared_memory_data_consumer_handle.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <deque> | 8 #include <deque> |
| 9 #include <utility> |
9 | 10 |
10 #include "base/bind.h" | 11 #include "base/bind.h" |
11 #include "base/macros.h" | 12 #include "base/macros.h" |
12 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
13 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
14 #include "base/synchronization/lock.h" | 15 #include "base/synchronization/lock.h" |
15 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
16 #include "content/public/child/fixed_received_data.h" | 17 #include "content/public/child/fixed_received_data.h" |
17 | 18 |
18 namespace content { | 19 namespace content { |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 class DelegateThreadSafeReceivedData final | 23 class DelegateThreadSafeReceivedData final |
23 : public RequestPeer::ThreadSafeReceivedData { | 24 : public RequestPeer::ThreadSafeReceivedData { |
24 public: | 25 public: |
25 explicit DelegateThreadSafeReceivedData( | 26 explicit DelegateThreadSafeReceivedData( |
26 scoped_ptr<RequestPeer::ReceivedData> data) | 27 scoped_ptr<RequestPeer::ReceivedData> data) |
27 : data_(data.Pass()), task_runner_(base::ThreadTaskRunnerHandle::Get()) {} | 28 : data_(std::move(data)), |
| 29 task_runner_(base::ThreadTaskRunnerHandle::Get()) {} |
28 ~DelegateThreadSafeReceivedData() override { | 30 ~DelegateThreadSafeReceivedData() override { |
29 if (!task_runner_->BelongsToCurrentThread()) { | 31 if (!task_runner_->BelongsToCurrentThread()) { |
30 // Delete the data on the original thread. | 32 // Delete the data on the original thread. |
31 task_runner_->DeleteSoon(FROM_HERE, data_.release()); | 33 task_runner_->DeleteSoon(FROM_HERE, data_.release()); |
32 } | 34 } |
33 } | 35 } |
34 | 36 |
35 const char* payload() const override { return data_->payload(); } | 37 const char* payload() const override { return data_->payload(); } |
36 int length() const override { return data_->length(); } | 38 int length() const override { return data_->length(); } |
37 int encoded_length() const override { return data_->encoded_length(); } | 39 int encoded_length() const override { return data_->encoded_length(); } |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 base::AutoLock lock(context_->lock()); | 298 base::AutoLock lock(context_->lock()); |
297 if (!context_->is_handle_active() && !context_->is_handle_locked()) { | 299 if (!context_->is_handle_active() && !context_->is_handle_locked()) { |
298 // No one is interested in the data. | 300 // No one is interested in the data. |
299 return; | 301 return; |
300 } | 302 } |
301 | 303 |
302 needs_notification = context_->IsEmpty(); | 304 needs_notification = context_->IsEmpty(); |
303 scoped_ptr<RequestPeer::ThreadSafeReceivedData> data_to_pass; | 305 scoped_ptr<RequestPeer::ThreadSafeReceivedData> data_to_pass; |
304 if (mode_ == kApplyBackpressure) { | 306 if (mode_ == kApplyBackpressure) { |
305 data_to_pass = | 307 data_to_pass = |
306 make_scoped_ptr(new DelegateThreadSafeReceivedData(data.Pass())); | 308 make_scoped_ptr(new DelegateThreadSafeReceivedData(std::move(data))); |
307 } else { | 309 } else { |
308 data_to_pass = make_scoped_ptr(new FixedReceivedData(data.get())); | 310 data_to_pass = make_scoped_ptr(new FixedReceivedData(data.get())); |
309 } | 311 } |
310 context_->Push(data_to_pass.Pass()); | 312 context_->Push(std::move(data_to_pass)); |
311 } | 313 } |
312 | 314 |
313 if (needs_notification) { | 315 if (needs_notification) { |
314 // We CAN issue the notification synchronously if the associated reader | 316 // We CAN issue the notification synchronously if the associated reader |
315 // lives in this thread, because this function cannot be called in the | 317 // lives in this thread, because this function cannot be called in the |
316 // client's callback. | 318 // client's callback. |
317 context_->Notify(); | 319 context_->Notify(); |
318 } | 320 } |
319 } | 321 } |
320 | 322 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 SharedMemoryDataConsumerHandle::ReaderImpl* | 475 SharedMemoryDataConsumerHandle::ReaderImpl* |
474 SharedMemoryDataConsumerHandle::obtainReaderInternal(Client* client) { | 476 SharedMemoryDataConsumerHandle::obtainReaderInternal(Client* client) { |
475 return new ReaderImpl(context_, client); | 477 return new ReaderImpl(context_, client); |
476 } | 478 } |
477 | 479 |
478 const char* SharedMemoryDataConsumerHandle::debugName() const { | 480 const char* SharedMemoryDataConsumerHandle::debugName() const { |
479 return "SharedMemoryDataConsumerHandle"; | 481 return "SharedMemoryDataConsumerHandle"; |
480 } | 482 } |
481 | 483 |
482 } // namespace content | 484 } // namespace content |
OLD | NEW |