OLD | NEW |
---|---|
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_EDK_SYSTEM_CHILD_BROKER_H_ | 5 #ifndef MOJO_EDK_SYSTEM_CHILD_BROKER_H_ |
6 #define MOJO_EDK_SYSTEM_CHILD_BROKER_H_ | 6 #define MOJO_EDK_SYSTEM_CHILD_BROKER_H_ |
7 | 7 |
8 #include "base/compiler_specific.h" | |
9 #include "base/containers/hash_tables.h" | |
10 #include "base/macros.h" | |
8 #include "base/memory/singleton.h" | 11 #include "base/memory/singleton.h" |
12 #include "base/process/process_handle.h" | |
9 #include "base/synchronization/lock_impl.h" | 13 #include "base/synchronization/lock_impl.h" |
10 #include "mojo/edk/embedder/scoped_platform_handle.h" | 14 #include "mojo/edk/embedder/scoped_platform_handle.h" |
11 #include "mojo/edk/system/broker.h" | 15 #include "mojo/edk/system/broker.h" |
16 #include "mojo/edk/system/raw_channel.h" | |
12 #include "mojo/edk/system/system_impl_export.h" | 17 #include "mojo/edk/system/system_impl_export.h" |
13 | 18 |
14 namespace mojo { | 19 namespace mojo { |
15 namespace edk { | 20 namespace edk { |
21 class RoutedRawChannel; | |
16 struct BrokerMessage; | 22 struct BrokerMessage; |
17 | 23 |
18 // An implementation of Broker used in (sandboxed) child processes. It talks | 24 // An implementation of Broker used in (sandboxed) child processes. It talks |
19 // over sync IPCs to the (unsandboxed) parent process (specifically, | 25 // over sync IPCs to the (unsandboxed) parent process (specifically, |
20 // ParentBroker) to convert handles to tokens and vice versa. | 26 // ChildBrokerHost) to convert handles to tokens and vice versa. |
yzshen1
2015/12/03 23:37:50
Please consider updating the comment since it does
jam
2015/12/04 05:06:47
Done.
| |
21 class MOJO_SYSTEM_IMPL_EXPORT ChildBroker : public Broker { | 27 class MOJO_SYSTEM_IMPL_EXPORT ChildBroker |
28 : public Broker, public RawChannel::Delegate { | |
22 public: | 29 public: |
23 static ChildBroker* GetInstance(); | 30 static ChildBroker* GetInstance(); |
24 | 31 |
25 // Passes the platform handle that is used to talk to ChildBrokerHost. | 32 // Passes the platform handle that is used to talk to ChildBrokerHost. |
26 void SetChildBrokerHostHandle(ScopedPlatformHandle handle); | 33 void SetChildBrokerHostHandle(ScopedPlatformHandle handle); |
27 | 34 |
28 // Broker implementation: | 35 // Broker implementation: |
29 #if defined(OS_WIN) | 36 #if defined(OS_WIN) |
30 void CreatePlatformChannelPair(ScopedPlatformHandle* server, | 37 void CreatePlatformChannelPair(ScopedPlatformHandle* server, |
31 ScopedPlatformHandle* client) override; | 38 ScopedPlatformHandle* client) override; |
32 void HandleToToken(const PlatformHandle* platform_handles, | 39 void HandleToToken(const PlatformHandle* platform_handles, |
33 size_t count, | 40 size_t count, |
34 uint64_t* tokens) override; | 41 uint64_t* tokens) override; |
35 void TokenToHandle(const uint64_t* tokens, | 42 void TokenToHandle(const uint64_t* tokens, |
36 size_t count, | 43 size_t count, |
37 PlatformHandle* handles) override; | 44 PlatformHandle* handles) override; |
38 #endif | 45 #endif |
46 void ConnectMessagePipe(uint64_t pipe_id, | |
47 MessagePipeDispatcher* message_pipe) override; | |
48 void CloseMessagePipe(uint64_t pipe_id, | |
49 MessagePipeDispatcher* message_pipe) override; | |
39 | 50 |
40 private: | 51 private: |
41 friend struct base::DefaultSingletonTraits<ChildBroker>; | 52 friend struct base::DefaultSingletonTraits<ChildBroker>; |
42 | 53 |
43 ChildBroker(); | 54 ChildBroker(); |
44 ~ChildBroker() override; | 55 ~ChildBroker() override; |
45 | 56 |
57 // RawChannel::Delegate implementation: | |
58 void OnReadMessage( | |
59 const MessageInTransit::View& message_view, | |
60 ScopedPlatformHandleVectorPtr platform_handles) override; | |
61 void OnError(Error error) override; | |
62 | |
63 // Callback for when a RoutedRawChannel is destroyed for cleanup. | |
64 void ChannelDestructed(RoutedRawChannel* channel); | |
65 | |
66 #if defined(OS_WIN) | |
46 // Helper method to write the given message and read back the result. | 67 // Helper method to write the given message and read back the result. |
47 bool WriteAndReadResponse(BrokerMessage* message, | 68 bool WriteAndReadResponse(BrokerMessage* message, |
48 void* response, | 69 void* response, |
49 uint32_t response_size); | 70 uint32_t response_size); |
50 | 71 |
72 void CreatePlatformChannelPairNoLock(ScopedPlatformHandle* server, | |
73 ScopedPlatformHandle* client); | |
74 | |
75 // Pipe used for communication to the parent process. We use a pipe directly | |
76 // instead of bindings or RawChannel because we need to send synchronous | |
77 // messages with replies from any thread. | |
78 ScopedPlatformHandle parent_sync_channel_; | |
79 #endif | |
80 | |
81 // RawChannel used for asynchronous communication to and from the parent | |
82 // process. Since these messages are bidirectional, we can't use | |
83 // |parent_sync_channel_| which is only used for sync messages to the parent. | |
84 // However since the messages are asynchronous, we can use RawChannel for | |
85 // convenience instead of writing and reading from pipes manually. Although it | |
86 // would be convenient, we don't use Mojo IPC because it would be a layering | |
87 // violation (and cirular dependency) if the system layer depended on | |
88 // bindings. | |
89 RawChannel* parent_async_channel_; | |
90 | |
51 // Guards access to below. | 91 // Guards access to below. |
yzshen1
2015/12/03 23:37:50
I think |lock_| guards |parent_[a]sync_channel_| a
jam
2015/12/04 05:06:47
Done.
| |
52 // We use LockImpl instead of Lock because the latter adds thread checking | 92 // We use LockImpl instead of Lock because the latter adds thread checking |
53 // that we don't want (since we lock in the constructor and unlock on another | 93 // that we don't want (since we lock in the constructor and unlock on another |
54 // thread. | 94 // thread. |
55 base::internal::LockImpl lock_; | 95 base::internal::LockImpl lock_; |
56 ScopedPlatformHandle handle_; | 96 |
97 // Maps from routing ids to the MessagePipeDispatcher that have requested to | |
98 // connect to them. When the parent replies with which process they should be | |
99 // connected to, they will migrate to |connected_pipes_|. | |
100 base::hash_map<uint64_t, MessagePipeDispatcher*> pending_connects_; | |
101 | |
102 // Map from MessagePipeDispatcher to its RoutedRawChannel. This is needed so | |
103 // that when a MessagePipeDispatcher is closed we can remove the route for the | |
104 // corresponding RoutedRawChannel. | |
105 // Note the key is MessagePipeDispatcher*, instead of pipe_id, because when | |
106 // the two pipes are in the same process they will have one pipe_id but be | |
107 // connected to the two RoutedRawChannel objects below. | |
108 base::hash_map<MessagePipeDispatcher*, RoutedRawChannel*> connected_pipes_; | |
109 | |
110 // Holds a map of all the RoutedRawChannel that connect this child process to | |
111 // any other process. The key is the peer process'd pid. | |
112 base::hash_map<base::ProcessId, RoutedRawChannel*> channels_; | |
113 | |
114 // Used for message pipes in the same process. | |
115 RoutedRawChannel* in_process_pipes_channel1_; | |
116 RoutedRawChannel* in_process_pipes_channel2_; | |
117 | |
118 DISALLOW_COPY_AND_ASSIGN(ChildBroker); | |
57 }; | 119 }; |
58 | 120 |
59 } // namespace edk | 121 } // namespace edk |
60 } // namespace mojo | 122 } // namespace mojo |
61 | 123 |
62 #endif // MOJO_EDK_SYSTEM_CHILD_BROKER_H_ | 124 #endif // MOJO_EDK_SYSTEM_CHILD_BROKER_H_ |
OLD | NEW |