Index: mojo/public/cpp/bindings/associated_interface_ptr.h |
diff --git a/mojo/public/cpp/bindings/associated_interface_ptr.h b/mojo/public/cpp/bindings/associated_interface_ptr.h |
index 7cef1eb418ce829bace540bcde851954b6f3848d..f30f3d8c4c39e2d30817c0e01399df03ae7d5210 100644 |
--- a/mojo/public/cpp/bindings/associated_interface_ptr.h |
+++ b/mojo/public/cpp/bindings/associated_interface_ptr.h |
@@ -66,9 +66,10 @@ class AssociatedInterfacePtr { |
// multiple task runners to a single thread for the purposes of task |
// scheduling. |
// |
- // NOTE: Please see the comments of |
- // AssociatedGroup.CreateAssociatedInterface() about when you can use this |
- // object to make calls. |
+ // NOTE: The corresponding AssociatedInterfaceRequest must be sent over |
+ // another interface before using this object to make calls. Please see the |
+ // comments of MakeRequest(AssociatedInterfacePtr<Interface>*) for more |
+ // details. |
void Bind(AssociatedInterfacePtrInfo<Interface> info, |
scoped_refptr<base::SingleThreadTaskRunner> runner = |
base::ThreadTaskRunnerHandle::Get()) { |
@@ -197,30 +198,49 @@ class AssociatedInterfacePtr { |
DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtr); |
}; |
-// Creates an associated interface. The output |ptr| should be used locally |
-// while the returned request should be passed through the message pipe endpoint |
-// referred to by |associated_group| to setup the corresponding associated |
-// interface implementation at the remote side. |
+// Creates an associated interface. The returned request is supposed to be sent |
+// over another interface (either associated or non-associated). |
// |
-// NOTE: |ptr| should NOT be used to make calls before the request is sent. |
-// Violating that will cause the message pipe to be closed. On the other hand, |
-// as soon as the request is sent, |ptr| is usable. There is no need to wait |
-// until the request is bound to an implementation at the remote side. |
+// NOTE: |ptr| must NOT be used to make calls before the request is sent. |
+// Violating that will lead to crash. On the other hand, as soon as the request |
+// is sent, |ptr| is usable. There is no need to wait until the request is bound |
+// to an implementation at the remote side. |
+// TODO(yzshen): Remove the |group| parameter. |
template <typename Interface> |
AssociatedInterfaceRequest<Interface> MakeRequest( |
AssociatedInterfacePtr<Interface>* ptr, |
- AssociatedGroup* group, |
+ AssociatedGroup* group = nullptr, |
scoped_refptr<base::SingleThreadTaskRunner> runner = |
base::ThreadTaskRunnerHandle::Get()) { |
- AssociatedInterfaceRequest<Interface> request; |
AssociatedInterfacePtrInfo<Interface> ptr_info; |
- group->CreateAssociatedInterface(AssociatedGroup::WILL_PASS_REQUEST, |
- &ptr_info, &request); |
- |
+ auto request = MakeRequest(&ptr_info); |
ptr->Bind(std::move(ptr_info), std::move(runner)); |
return request; |
} |
+// Creates an associated interface. One of the two endpoints is supposed to be |
+// sent over another interface (either associated or non-associated); while the |
+// other is used locally. |
+// |
+// NOTE: If |ptr_info| is used locally and bound to an AssociatedInterfacePtr, |
+// the interface pointer must NOT be used to make calls before the request is |
+// sent. Please see NOTE of the previous function for more details. |
+template <typename Interface> |
+AssociatedInterfaceRequest<Interface> MakeRequest( |
+ AssociatedInterfacePtrInfo<Interface>* ptr_info) { |
+ ScopedInterfaceEndpointHandle handle0; |
+ ScopedInterfaceEndpointHandle handle1; |
+ ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&handle0, |
+ &handle1); |
+ |
+ ptr_info->set_handle(std::move(handle0)); |
+ ptr_info->set_version(0); |
+ |
+ AssociatedInterfaceRequest<Interface> request; |
+ request.Bind(std::move(handle1)); |
+ return request; |
+} |
+ |
// Like |GetProxy|, but the interface is never associated with any other |
// interface. The returned request can be bound directly to the corresponding |
// associated interface implementation, without first passing it through a |