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

Unified Diff: ipc/ipc_channel_proxy.h

Issue 2668153003: Mojo C++ Bindings: Eliminate unbound ThreadSafeInterfacePtr (Closed)
Patch Set: . Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: ipc/ipc_channel_proxy.h
diff --git a/ipc/ipc_channel_proxy.h b/ipc/ipc_channel_proxy.h
index bda83bb18854299b58c977b6a5a349e76cf4e15b..bb593671aa82650215d7288b0aece7ea1c341dba 100644
--- a/ipc/ipc_channel_proxy.h
+++ b/ipc/ipc_channel_proxy.h
@@ -22,8 +22,10 @@
#include "ipc/ipc_listener.h"
#include "ipc/ipc_sender.h"
#include "mojo/public/cpp/bindings/associated_group.h"
+#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
+#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
namespace base {
class SingleThreadTaskRunner;
@@ -209,17 +211,23 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe {
}
#endif
+ // Creates a ThreadSafeAssociatedInterfacePtr for |Interface|. This object
+ // may be used to send messages on the interface from any thread and those
+ // messages will remain ordered with respect to other messages sent on the
+ // same thread over other ThreadSafeAssociatedInterfacePtrs associated with
+ // the same Channel.
template <typename Interface>
- using AssociatedInterfaceRetrievedCallback =
- base::Callback<void(mojo::AssociatedInterfacePtr<Interface>)>;
- // Creates an AssociatedInterfacePtr to |Interface| on the IO thread and
- // passes it to |callback|, also invoked on the IO thread.
- template <typename Interface>
- void RetrieveAssociatedInterfaceOnIOThread(
- const AssociatedInterfaceRetrievedCallback<Interface>& callback) {
- context_->ipc_task_runner()->PostTask(
- FROM_HERE, base::Bind(&Context::RetrieveAssociatedInterface<Interface>,
- context_, callback));
+ void GetThreadSafeRemoteAssociatedInterface(
+ scoped_refptr<mojo::ThreadSafeAssociatedInterfacePtr<Interface>>*
+ out_ptr) {
+ DCHECK(GetAssociatedGroup());
+ mojo::AssociatedInterfacePtr<Interface> ptr;
+ mojom::GenericInterfaceAssociatedRequest request;
+ request.Bind(mojo::MakeRequest(&ptr, GetAssociatedGroup()).PassHandle());
+ context()->thread_safe_channel().GetAssociatedInterface(
yzshen1 2017/02/07 00:06:26 nit: you could call GetGenericRemoteAssociatedInte
Ken Rockot(use gerrit already) 2017/02/07 01:25:32 done (called GetRemoteAssociatedInterface instead)
yzshen1 2017/02/07 06:05:52 Using GetRemoteAssociatedInterface() will setup an
Ken Rockot(use gerrit already) 2017/02/08 00:37:11 Ah good point. Changed to use GetGenericRemoteAsso
+ Interface::Name_, std::move(request));
+ *out_ptr = mojo::ThreadSafeAssociatedInterfacePtr<Interface>::Create(
+ ptr.PassInterface(), ipc_task_runner());
}
base::SingleThreadTaskRunner* ipc_task_runner() const {
@@ -251,11 +259,6 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe {
// Sends |message| from appropriate thread.
void Send(Message* message);
- // Requests a remote associated interface on the IPC thread.
- void GetRemoteAssociatedInterface(
- const std::string& name,
- mojo::ScopedInterfaceEndpointHandle handle);
-
protected:
friend class base::RefCountedThreadSafe<Context>;
~Context() override;
@@ -299,14 +302,6 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe {
void OnSendMessage(std::unique_ptr<Message> message_ptr);
void OnAddFilter();
void OnRemoveFilter(MessageFilter* filter);
- template <typename Interface>
- void RetrieveAssociatedInterface(
- const AssociatedInterfaceRetrievedCallback<Interface>& callback) {
- mojo::AssociatedInterfacePtr<Interface> interface_ptr;
- channel_->GetAssociatedInterfaceSupport()->GetRemoteAssociatedInterface(
- &interface_ptr);
- callback.Run(std::move(interface_ptr));
- }
// Methods called on the listener thread.
void AddFilter(MessageFilter* filter);
@@ -320,6 +315,9 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe {
void ClearChannel();
mojo::AssociatedGroup* associated_group() { return &associated_group_; }
+ mojom::Channel& thread_safe_channel() {
+ return thread_safe_channel_->proxy();
+ }
void AddGenericAssociatedInterfaceForIOThread(
const std::string& name,
@@ -360,6 +358,11 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe {
mojo::AssociatedGroup associated_group_;
+ // A thread-safe mojom::Channel interface we ues to make remote interface
yzshen1 2017/02/07 00:06:26 ues -> use please.
Ken Rockot(use gerrit already) 2017/02/07 01:25:32 done
+ // requests from the proxy thread.
+ std::unique_ptr<mojo::ThreadSafeForwarder<mojom::Channel>>
+ thread_safe_channel_;
+
// Holds associated interface binders added by
// AddGenericAssociatedInterfaceForIOThread until the underlying channel has
// been initialized.

Powered by Google App Engine
This is Rietveld 408576698