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

Side by Side Diff: mojo/public/cpp/bindings/lib/multiplex_router.h

Issue 2100683002: Mojo C++ Bindings: Extract AssociatedGroupController from MultiplexRouter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: oops more gyp ugh Created 4 years, 5 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 unified diff | Download patch
OLDNEW
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 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_ 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <deque> 10 #include <deque>
11 #include <map> 11 #include <map>
12 #include <memory> 12 #include <memory>
13 #include <string> 13 #include <string>
14 14
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
18 #include "base/memory/ref_counted_delete_on_message_loop.h"
19 #include "base/memory/weak_ptr.h" 18 #include "base/memory/weak_ptr.h"
20 #include "base/single_thread_task_runner.h" 19 #include "base/single_thread_task_runner.h"
21 #include "base/synchronization/lock.h" 20 #include "base/synchronization/lock.h"
22 #include "base/threading/thread_checker.h" 21 #include "base/threading/thread_checker.h"
22 #include "mojo/public/cpp/bindings/associated_group_controller.h"
23 #include "mojo/public/cpp/bindings/interface_id.h"
23 #include "mojo/public/cpp/bindings/lib/connector.h" 24 #include "mojo/public/cpp/bindings/lib/connector.h"
24 #include "mojo/public/cpp/bindings/lib/interface_id.h"
25 #include "mojo/public/cpp/bindings/lib/message_header_validator.h" 25 #include "mojo/public/cpp/bindings/lib/message_header_validator.h"
26 #include "mojo/public/cpp/bindings/lib/pipe_control_message_handler.h" 26 #include "mojo/public/cpp/bindings/lib/pipe_control_message_handler.h"
27 #include "mojo/public/cpp/bindings/lib/pipe_control_message_handler_delegate.h" 27 #include "mojo/public/cpp/bindings/lib/pipe_control_message_handler_delegate.h"
28 #include "mojo/public/cpp/bindings/lib/pipe_control_message_proxy.h" 28 #include "mojo/public/cpp/bindings/lib/pipe_control_message_proxy.h"
29 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" 29 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
30 30
31 namespace base { 31 namespace base {
32 class SingleThreadTaskRunner; 32 class SingleThreadTaskRunner;
33 } 33 }
34 34
35 namespace mojo { 35 namespace mojo {
36 36
37 class AssociatedGroup; 37 class AssociatedGroup;
38 38
39 namespace internal { 39 namespace internal {
40 40
41 class InterfaceEndpointClient;
42 class InterfaceEndpointController;
43
44 // MultiplexRouter supports routing messages for multiple interfaces over a 41 // MultiplexRouter supports routing messages for multiple interfaces over a
45 // single message pipe. 42 // single message pipe.
46 // 43 //
47 // It is created on the thread where the master interface of the message pipe 44 // It is created on the thread where the master interface of the message pipe
48 // lives. Although it is ref-counted, it is guarateed to be destructed on the 45 // lives. Although it is ref-counted, it is guarateed to be destructed on the
49 // same thread. 46 // same thread.
50 // Some public methods are only allowed to be called on the creating thread; 47 // Some public methods are only allowed to be called on the creating thread;
51 // while the others are safe to call from any threads. Please see the method 48 // while the others are safe to call from any threads. Please see the method
52 // comments for more details. 49 // comments for more details.
53 class MultiplexRouter 50 class MultiplexRouter
54 : public MessageReceiver, 51 : public MessageReceiver,
55 public base::RefCountedDeleteOnMessageLoop<MultiplexRouter>, 52 public AssociatedGroupController,
56 public PipeControlMessageHandlerDelegate { 53 public PipeControlMessageHandlerDelegate {
57 public: 54 public:
58 // If |set_interface_id_namespace_bit| is true, the interface IDs generated by 55 // If |set_interface_id_namespace_bit| is true, the interface IDs generated by
59 // this router will have the highest bit set. 56 // this router will have the highest bit set.
60 MultiplexRouter(bool set_interface_id_namespace_bit, 57 MultiplexRouter(bool set_interface_id_namespace_bit,
61 ScopedMessagePipeHandle message_pipe, 58 ScopedMessagePipeHandle message_pipe,
62 scoped_refptr<base::SingleThreadTaskRunner> runner); 59 scoped_refptr<base::SingleThreadTaskRunner> runner);
63 60
64 // Sets the master interface name for this router. Only used when reporting 61 // Sets the master interface name for this router. Only used when reporting
65 // message header or control message validation errors. 62 // message header or control message validation errors.
66 void SetMasterInterfaceName(const std::string& name); 63 void SetMasterInterfaceName(const std::string& name);
67 64
68 // --------------------------------------------------------------------------- 65 // ---------------------------------------------------------------------------
69 // The following public methods are safe to call from any threads. 66 // The following public methods are safe to call from any threads.
70 67
71 // Creates a pair of interface endpoint handles. The method generates a new 68 // AssociatedGroupController implementation:
72 // interface ID and assigns it to the two handles. |local_endpoint| is used 69 void CreateEndpointHandlePair(
73 // locally; while |remote_endpoint| is sent over the message pipe. 70 ScopedInterfaceEndpointHandle* local_endpoint,
74 void CreateEndpointHandlePair(ScopedInterfaceEndpointHandle* local_endpoint, 71 ScopedInterfaceEndpointHandle* remote_endpoint) override;
75 ScopedInterfaceEndpointHandle* remote_endpoint); 72 ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(
76 73 InterfaceId id) override;
77 // Creates an interface endpoint handle from a given interface ID. The handle 74 void CloseEndpointHandle(InterfaceId id, bool is_local) override;
78 // is used locally.
79 // Typically, this method is used to (1) create an endpoint handle for the
80 // master interface; or (2) create an endpoint handle on receiving an
81 // interface ID from the message pipe.
82 ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(InterfaceId id);
83
84 // Closes an interface endpoint handle.
85 void CloseEndpointHandle(InterfaceId id, bool is_local);
86
87 // Attaches a client to the specified endpoint to send and receive messages.
88 // The returned object is still owned by the router. It must only be used on
89 // the same thread as this call, and only before the client is detached using
90 // DetachEndpointClient().
91 InterfaceEndpointController* AttachEndpointClient( 75 InterfaceEndpointController* AttachEndpointClient(
92 const ScopedInterfaceEndpointHandle& handle, 76 const ScopedInterfaceEndpointHandle& handle,
93 InterfaceEndpointClient* endpoint_client, 77 InterfaceEndpointClient* endpoint_client,
94 scoped_refptr<base::SingleThreadTaskRunner> runner); 78 scoped_refptr<base::SingleThreadTaskRunner> runner) override;
95 79 void DetachEndpointClient(
96 // Detaches the client attached to the specified endpoint. It must be called 80 const ScopedInterfaceEndpointHandle& handle) override;
97 // on the same thread as the corresponding AttachEndpointClient() call. 81 void RaiseError() override;
98 void DetachEndpointClient(const ScopedInterfaceEndpointHandle& handle);
99
100 // Raises an error on the underlying message pipe. It disconnects the pipe
101 // and notifies all interfaces running on this pipe.
102 void RaiseError();
103
104 std::unique_ptr<AssociatedGroup> CreateAssociatedGroup();
105
106 static MultiplexRouter* GetRouter(AssociatedGroup* associated_group);
107 82
108 // --------------------------------------------------------------------------- 83 // ---------------------------------------------------------------------------
109 // The following public methods are called on the creating thread. 84 // The following public methods are called on the creating thread.
110 85
111 // Please note that this method shouldn't be called unless it results from an 86 // Please note that this method shouldn't be called unless it results from an
112 // explicit request of the user of bindings (e.g., the user sets an 87 // explicit request of the user of bindings (e.g., the user sets an
113 // InterfacePtr to null or closes a Binding). 88 // InterfacePtr to null or closes a Binding).
114 void CloseMessagePipe(); 89 void CloseMessagePipe();
115 90
116 // Extracts the underlying message pipe. 91 // Extracts the underlying message pipe.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 return connector_.is_valid(); 125 return connector_.is_valid();
151 } 126 }
152 127
153 // TODO(yzshen): consider removing this getter. 128 // TODO(yzshen): consider removing this getter.
154 MessagePipeHandle handle() const { 129 MessagePipeHandle handle() const {
155 DCHECK(thread_checker_.CalledOnValidThread()); 130 DCHECK(thread_checker_.CalledOnValidThread());
156 return connector_.handle(); 131 return connector_.handle();
157 } 132 }
158 133
159 private: 134 private:
160 friend class base::RefCountedDeleteOnMessageLoop<MultiplexRouter>;
161 friend class base::DeleteHelper<MultiplexRouter>;
162
163 class InterfaceEndpoint; 135 class InterfaceEndpoint;
164 struct Task; 136 struct Task;
165 137
166 ~MultiplexRouter() override; 138 ~MultiplexRouter() override;
167 139
168 // MessageReceiver implementation: 140 // MessageReceiver implementation:
169 bool Accept(Message* message) override; 141 bool Accept(Message* message) override;
170 142
171 // PipeControlMessageHandlerDelegate implementation: 143 // PipeControlMessageHandlerDelegate implementation:
172 bool OnPeerAssociatedEndpointClosed(InterfaceId id) override; 144 bool OnPeerAssociatedEndpointClosed(InterfaceId id) override;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 231
260 bool testing_mode_; 232 bool testing_mode_;
261 233
262 DISALLOW_COPY_AND_ASSIGN(MultiplexRouter); 234 DISALLOW_COPY_AND_ASSIGN(MultiplexRouter);
263 }; 235 };
264 236
265 } // namespace internal 237 } // namespace internal
266 } // namespace mojo 238 } // namespace mojo
267 239
268 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_ 240 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/lib/interface_ptr_state.h ('k') | mojo/public/cpp/bindings/lib/multiplex_router.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698