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 "ipc/ipc_channel_proxy.h" | 5 #include "ipc/ipc_channel_proxy.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <utility> | 10 #include <utility> |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 std::unique_ptr<ChannelFactory> factory) { | 61 std::unique_ptr<ChannelFactory> factory) { |
62 base::AutoLock l(channel_lifetime_lock_); | 62 base::AutoLock l(channel_lifetime_lock_); |
63 DCHECK(!channel_); | 63 DCHECK(!channel_); |
64 DCHECK_EQ(factory->GetIPCTaskRunner(), ipc_task_runner_); | 64 DCHECK_EQ(factory->GetIPCTaskRunner(), ipc_task_runner_); |
65 channel_ = factory->BuildChannel(this); | 65 channel_ = factory->BuildChannel(this); |
66 | 66 |
67 Channel::AssociatedInterfaceSupport* support = | 67 Channel::AssociatedInterfaceSupport* support = |
68 channel_->GetAssociatedInterfaceSupport(); | 68 channel_->GetAssociatedInterfaceSupport(); |
69 if (support) { | 69 if (support) { |
70 associated_group_ = *support->GetAssociatedGroup(); | 70 associated_group_ = *support->GetAssociatedGroup(); |
| 71 thread_safe_channel_ = support->CreateThreadSafeChannel(); |
71 | 72 |
72 base::AutoLock l(pending_filters_lock_); | 73 base::AutoLock l(pending_filters_lock_); |
73 for (auto& entry : pending_io_thread_interfaces_) | 74 for (auto& entry : pending_io_thread_interfaces_) |
74 support->AddGenericAssociatedInterface(entry.first, entry.second); | 75 support->AddGenericAssociatedInterface(entry.first, entry.second); |
75 pending_io_thread_interfaces_.clear(); | 76 pending_io_thread_interfaces_.clear(); |
76 } | 77 } |
77 } | 78 } |
78 | 79 |
79 bool ChannelProxy::Context::TryFilters(const Message& message) { | 80 bool ChannelProxy::Context::TryFilters(const Message& message) { |
80 DCHECK(message_filter_router_); | 81 DCHECK(message_filter_router_); |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 if (support) | 392 if (support) |
392 support->AddGenericAssociatedInterface(name, factory); | 393 support->AddGenericAssociatedInterface(name, factory); |
393 } | 394 } |
394 | 395 |
395 void ChannelProxy::Context::Send(Message* message) { | 396 void ChannelProxy::Context::Send(Message* message) { |
396 ipc_task_runner()->PostTask( | 397 ipc_task_runner()->PostTask( |
397 FROM_HERE, base::Bind(&ChannelProxy::Context::OnSendMessage, this, | 398 FROM_HERE, base::Bind(&ChannelProxy::Context::OnSendMessage, this, |
398 base::Passed(base::WrapUnique(message)))); | 399 base::Passed(base::WrapUnique(message)))); |
399 } | 400 } |
400 | 401 |
401 // Called on the IPC::Channel thread | |
402 void ChannelProxy::Context::GetRemoteAssociatedInterface( | |
403 const std::string& name, | |
404 mojo::ScopedInterfaceEndpointHandle handle) { | |
405 if (!channel_) | |
406 return; | |
407 Channel::AssociatedInterfaceSupport* associated_interface_support = | |
408 channel_->GetAssociatedInterfaceSupport(); | |
409 DCHECK(associated_interface_support); | |
410 associated_interface_support->GetGenericRemoteAssociatedInterface( | |
411 name, std::move(handle)); | |
412 } | |
413 | |
414 //----------------------------------------------------------------------------- | 402 //----------------------------------------------------------------------------- |
415 | 403 |
416 // static | 404 // static |
417 std::unique_ptr<ChannelProxy> ChannelProxy::Create( | 405 std::unique_ptr<ChannelProxy> ChannelProxy::Create( |
418 const IPC::ChannelHandle& channel_handle, | 406 const IPC::ChannelHandle& channel_handle, |
419 Channel::Mode mode, | 407 Channel::Mode mode, |
420 Listener* listener, | 408 Listener* listener, |
421 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { | 409 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { |
422 std::unique_ptr<ChannelProxy> channel( | 410 std::unique_ptr<ChannelProxy> channel( |
423 new ChannelProxy(listener, ipc_task_runner)); | 411 new ChannelProxy(listener, ipc_task_runner)); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 } | 561 } |
574 | 562 |
575 mojo::AssociatedGroup* ChannelProxy::GetAssociatedGroup() { | 563 mojo::AssociatedGroup* ChannelProxy::GetAssociatedGroup() { |
576 return context()->associated_group(); | 564 return context()->associated_group(); |
577 } | 565 } |
578 | 566 |
579 void ChannelProxy::GetGenericRemoteAssociatedInterface( | 567 void ChannelProxy::GetGenericRemoteAssociatedInterface( |
580 const std::string& name, | 568 const std::string& name, |
581 mojo::ScopedInterfaceEndpointHandle handle) { | 569 mojo::ScopedInterfaceEndpointHandle handle) { |
582 DCHECK(did_init_); | 570 DCHECK(did_init_); |
583 context_->ipc_task_runner()->PostTask( | 571 mojom::GenericInterfaceAssociatedRequest request; |
584 FROM_HERE, base::Bind(&Context::GetRemoteAssociatedInterface, | 572 request.Bind(std::move(handle)); |
585 context_, name, base::Passed(&handle))); | 573 context()->thread_safe_channel().GetAssociatedInterface(name, |
| 574 std::move(request)); |
586 } | 575 } |
587 | 576 |
588 void ChannelProxy::ClearIPCTaskRunner() { | 577 void ChannelProxy::ClearIPCTaskRunner() { |
589 DCHECK(CalledOnValidThread()); | 578 DCHECK(CalledOnValidThread()); |
590 | |
591 context()->ClearIPCTaskRunner(); | 579 context()->ClearIPCTaskRunner(); |
592 } | 580 } |
593 | 581 |
594 void ChannelProxy::OnChannelInit() { | 582 void ChannelProxy::OnChannelInit() { |
595 } | 583 } |
596 | 584 |
597 //----------------------------------------------------------------------------- | 585 //----------------------------------------------------------------------------- |
598 | 586 |
599 } // namespace IPC | 587 } // namespace IPC |
OLD | NEW |