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

Unified Diff: mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h

Issue 2646853003: Mojo C++ bindings: Simplify associated interface API. (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: mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
diff --git a/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h b/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
index be57f20be5c68a842b0eebbc44dee60a5b62a354..16527cf747fc765646ca7f7632b1b51425468425 100644
--- a/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
+++ b/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
@@ -7,9 +7,12 @@
#include <string>
+#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
#include "mojo/public/cpp/bindings/bindings_export.h"
#include "mojo/public/cpp/bindings/disconnect_reason.h"
#include "mojo/public/cpp/bindings/interface_id.h"
@@ -20,8 +23,16 @@ class AssociatedGroupController;
// ScopedInterfaceEndpointHandle refers to one end of an interface, either the
// implementation side or the client side.
+// Threading: At any given time, a ScopedInterfaceEndpointHandle should only
+// be accessed from a single thread.
class MOJO_CPP_BINDINGS_EXPORT ScopedInterfaceEndpointHandle {
public:
+ // Creates a pair of handles representing the two endpoints of an interface,
+ // which are not yet associated with a message pipe.
+ static void CreatePairPendingAssociation(
+ ScopedInterfaceEndpointHandle* handle0,
+ ScopedInterfaceEndpointHandle* handle1);
+
// Creates an invalid endpoint handle.
ScopedInterfaceEndpointHandle();
@@ -32,43 +43,77 @@ class MOJO_CPP_BINDINGS_EXPORT ScopedInterfaceEndpointHandle {
ScopedInterfaceEndpointHandle& operator=(
ScopedInterfaceEndpointHandle&& other);
- bool is_valid() const { return IsValidInterfaceId(id_); }
+ bool is_valid() const;
- bool is_local() const { return is_local_; }
+ // Returns true if the interface hasn't associated with a message pipe.
+ bool pending_association() const;
- void reset();
- void ResetWithReason(uint32_t custom_reason, const std::string& description);
+ // Returns kInvalidInterfaceId when in pending association state or the handle
+ // is invalid.
+ InterfaceId id() const;
- void swap(ScopedInterfaceEndpointHandle& other);
+ // Returns null when in pending association state or the handle is invalid.
+ AssociatedGroupController* group_controller() const;
- // DO NOT USE METHODS BELOW THIS LINE. These are for internal use and testing.
+ // Returns the disconnect reason if the peer handle is closed before
+ // association and specifies a custom disconnect reason.
+ const base::Optional<DisconnectReason>& disconnect_reason() const;
- InterfaceId id() const { return id_; }
+ enum AssociationEvent {
+ // The interface has been associated with a message pipe.
+ ASSOCIATED,
+ // The peer of this object has been closed before association.
+ PEER_CLOSED_BEFORE_ASSOCIATION
+ };
- AssociatedGroupController* group_controller() const {
- return group_controller_.get();
- }
+ using AssociationEventCallback = base::OnceCallback<void(AssociationEvent)>;
+ // Note:
+ // - |handler| won't run if the handle is invalid. Otherwise, |handler| is run
+ // on the calling thread asynchronously, even if the interface has already
+ // been associated or the peer has been closed before association.
+ // - |handler| won't be called after this object is destroyed or reset.
+ // - A null |handler| can be used to cancel the previous callback.
+ void SetAssociationEventHandler(AssociationEventCallback handler);
- // Releases the handle without closing it.
- InterfaceId release();
+ void reset();
+ void ResetWithReason(uint32_t custom_reason, const std::string& description);
private:
friend class AssociatedGroupController;
+ friend class AssociatedGroup;
+
+ class State;
- // This is supposed to be used by AssociatedGroupController only.
- // |id| is the corresponding interface ID.
- // If |is_local| is false, this handle is meant to be passed over a message
- // pipe the remote side of the associated group.
+ // Used by AssociatedGroupController.
ScopedInterfaceEndpointHandle(
InterfaceId id,
- bool is_local,
scoped_refptr<AssociatedGroupController> group_controller);
+ // Used by AssociatedGroupController.
+ // The peer of this handle will join |peer_group_controller|.
+ bool NotifyAssociation(
+ InterfaceId id,
+ scoped_refptr<AssociatedGroupController> peer_group_controller);
+
void ResetInternal(const base::Optional<DisconnectReason>& reason);
- InterfaceId id_;
- bool is_local_;
- scoped_refptr<AssociatedGroupController> group_controller_;
+ // Used by AssociatedGroup.
+ // It is safe to run the returned callback on any thread, or after this handle
+ // is destroyed.
+ // The return value of the getter:
+ // - If the getter is retrieved when the handle is invalid, the return value
+ // of the getter will always be null.
+ // - If the getter is retrieved when the handle is valid and non-pending,
+ // the return value of the getter will be non-null and remain unchanged
+ // even if the handle is later reset.
+ // - If the getter is retrieved when the handle is valid but pending
+ // asssociation, the return value of the getter will initially be null,
+ // change to non-null when the handle is associated, and remain unchanged
+ // ever since.
+ base::Callback<AssociatedGroupController*()> CreateGroupControllerGetter()
+ const;
+
+ scoped_refptr<State> state_;
DISALLOW_COPY_AND_ASSIGN(ScopedInterfaceEndpointHandle);
};
« no previous file with comments | « mojo/public/cpp/bindings/pipe_control_message_proxy.h ('k') | mojo/public/cpp/bindings/tests/associated_interface_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698