OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "mojo/edk/system/core.h" | 5 #include "mojo/edk/system/core.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "mojo/edk/system/message_for_transit.h" | 29 #include "mojo/edk/system/message_for_transit.h" |
30 #include "mojo/edk/system/message_pipe_dispatcher.h" | 30 #include "mojo/edk/system/message_pipe_dispatcher.h" |
31 #include "mojo/edk/system/platform_handle_dispatcher.h" | 31 #include "mojo/edk/system/platform_handle_dispatcher.h" |
32 #include "mojo/edk/system/ports/name.h" | 32 #include "mojo/edk/system/ports/name.h" |
33 #include "mojo/edk/system/ports/node.h" | 33 #include "mojo/edk/system/ports/node.h" |
34 #include "mojo/edk/system/request_context.h" | 34 #include "mojo/edk/system/request_context.h" |
35 #include "mojo/edk/system/shared_buffer_dispatcher.h" | 35 #include "mojo/edk/system/shared_buffer_dispatcher.h" |
36 #include "mojo/edk/system/wait_set_dispatcher.h" | 36 #include "mojo/edk/system/wait_set_dispatcher.h" |
37 #include "mojo/edk/system/waiter.h" | 37 #include "mojo/edk/system/waiter.h" |
38 | 38 |
| 39 #if defined(OS_ANDROID) |
| 40 #include "base/android/jni_android.h" |
| 41 #endif |
| 42 |
39 namespace mojo { | 43 namespace mojo { |
40 namespace edk { | 44 namespace edk { |
41 | 45 |
42 namespace { | 46 namespace { |
43 | 47 |
44 // This is an unnecessarily large limit that is relatively easy to enforce. | 48 // This is an unnecessarily large limit that is relatively easy to enforce. |
45 const uint32_t kMaxHandlesPerMessage = 1024 * 1024; | 49 const uint32_t kMaxHandlesPerMessage = 1024 * 1024; |
46 | 50 |
47 // TODO(rockot): Maybe we could negotiate a debugging pipe ID for cross-process | 51 // TODO(rockot): Maybe we could negotiate a debugging pipe ID for cross-process |
48 // pipes too; for now we just use a constant. This only affects bootstrap pipes. | 52 // pipes too; for now we just use a constant. This only affects bootstrap pipes. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 handle.port = static_cast<mach_port_t>(platform_handle->value); | 86 handle.port = static_cast<mach_port_t>(platform_handle->value); |
83 break; | 87 break; |
84 #endif | 88 #endif |
85 | 89 |
86 #if defined(OS_WIN) | 90 #if defined(OS_WIN) |
87 case MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE: | 91 case MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE: |
88 handle.handle = reinterpret_cast<HANDLE>(platform_handle->value); | 92 handle.handle = reinterpret_cast<HANDLE>(platform_handle->value); |
89 break; | 93 break; |
90 #endif | 94 #endif |
91 | 95 |
| 96 #if defined(OS_ANDROID) |
| 97 case MOJO_PLATFORM_HANDLE_TYPE_PARCELABLE: |
| 98 handle.type = PlatformHandle::Type::PARCELABLE; |
| 99 handle.parcelable.Reset( |
| 100 base::android::AttachCurrentThread(), |
| 101 reinterpret_cast<jobject>(platform_handle->value)); |
| 102 break; |
| 103 #endif |
| 104 |
92 default: | 105 default: |
93 return MOJO_RESULT_INVALID_ARGUMENT; | 106 return MOJO_RESULT_INVALID_ARGUMENT; |
94 } | 107 } |
95 | 108 |
96 out_handle->reset(handle); | 109 out_handle->reset(handle); |
97 return MOJO_RESULT_OK; | 110 return MOJO_RESULT_OK; |
98 } | 111 } |
99 | 112 |
100 MojoResult ScopedPlatformHandleToMojoPlatformHandle( | 113 MojoResult ScopedPlatformHandleToMojoPlatformHandle( |
101 ScopedPlatformHandle handle, | 114 ScopedPlatformHandle handle, |
(...skipping 13 matching lines...) Expand all Loading... |
115 platform_handle->value = static_cast<uint64_t>(handle.release().handle); | 128 platform_handle->value = static_cast<uint64_t>(handle.release().handle); |
116 break; | 129 break; |
117 | 130 |
118 #if defined(OS_MACOSX) && !defined(OS_IOS) | 131 #if defined(OS_MACOSX) && !defined(OS_IOS) |
119 case PlatformHandle::Type::MACH: | 132 case PlatformHandle::Type::MACH: |
120 platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT; | 133 platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT; |
121 platform_handle->value = static_cast<uint64_t>(handle.release().port); | 134 platform_handle->value = static_cast<uint64_t>(handle.release().port); |
122 break; | 135 break; |
123 #endif // defined(OS_MACOSX) && !defined(OS_IOS) | 136 #endif // defined(OS_MACOSX) && !defined(OS_IOS) |
124 | 137 |
| 138 #if defined(OS_ANDROID) |
| 139 case PlatformHandle::Type::PARCELABLE: |
| 140 platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_PARCELABLE; |
| 141 platform_handle->value = |
| 142 reinterpret_cast<uint64_t>(handle.release().parcelable.Release()); |
| 143 break; |
| 144 #endif // defined(OS_ANDROID) |
| 145 |
125 default: | 146 default: |
126 return MOJO_RESULT_INVALID_ARGUMENT; | 147 return MOJO_RESULT_INVALID_ARGUMENT; |
127 } | 148 } |
128 #elif defined(OS_WIN) | 149 #elif defined(OS_WIN) |
129 platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE; | 150 platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE; |
130 platform_handle->value = reinterpret_cast<uint64_t>(handle.release().handle); | 151 platform_handle->value = reinterpret_cast<uint64_t>(handle.release().handle); |
131 #endif // defined(OS_WIN) | 152 #endif // defined(OS_WIN) |
132 | 153 |
133 return MOJO_RESULT_OK; | 154 return MOJO_RESULT_OK; |
134 } | 155 } |
(...skipping 30 matching lines...) Expand all Loading... |
165 base::AutoLock lock(handles_lock_); | 186 base::AutoLock lock(handles_lock_); |
166 return handles_.GetDispatcher(handle); | 187 return handles_.GetDispatcher(handle); |
167 } | 188 } |
168 | 189 |
169 void Core::SetDefaultProcessErrorCallback( | 190 void Core::SetDefaultProcessErrorCallback( |
170 const ProcessErrorCallback& callback) { | 191 const ProcessErrorCallback& callback) { |
171 default_process_error_callback_ = callback; | 192 default_process_error_callback_ = callback; |
172 } | 193 } |
173 | 194 |
174 void Core::AddChild(base::ProcessHandle process_handle, | 195 void Core::AddChild(base::ProcessHandle process_handle, |
175 ScopedPlatformHandle platform_handle, | 196 ConnectionParam connection_param, |
176 const std::string& child_token, | 197 const std::string& child_token, |
177 const ProcessErrorCallback& process_error_callback) { | 198 const ProcessErrorCallback& process_error_callback) { |
178 GetNodeController()->ConnectToChild(process_handle, | 199 GetNodeController()->ConnectToChild(process_handle, |
179 std::move(platform_handle), | 200 std::move(connection_param), child_token, |
180 child_token, | |
181 process_error_callback); | 201 process_error_callback); |
182 } | 202 } |
183 | 203 |
184 void Core::ChildLaunchFailed(const std::string& child_token) { | 204 void Core::ChildLaunchFailed(const std::string& child_token) { |
185 RequestContext request_context; | 205 RequestContext request_context; |
186 GetNodeController()->CloseChildPorts(child_token); | 206 GetNodeController()->CloseChildPorts(child_token); |
187 } | 207 } |
188 | 208 |
189 ScopedMessagePipeHandle Core::ConnectToPeerProcess( | 209 ScopedMessagePipeHandle Core::ConnectToPeerProcess( |
190 ScopedPlatformHandle pipe_handle, | 210 ScopedPlatformHandle pipe_handle, |
191 const std::string& peer_token) { | 211 const std::string& peer_token) { |
192 RequestContext request_context; | 212 RequestContext request_context; |
193 ports::PortRef port0, port1; | 213 ports::PortRef port0, port1; |
194 GetNodeController()->node()->CreatePortPair(&port0, &port1); | 214 GetNodeController()->node()->CreatePortPair(&port0, &port1); |
195 MojoHandle handle = AddDispatcher(new MessagePipeDispatcher( | 215 MojoHandle handle = AddDispatcher(new MessagePipeDispatcher( |
196 GetNodeController(), port0, kUnknownPipeIdForDebug, 0)); | 216 GetNodeController(), port0, kUnknownPipeIdForDebug, 0)); |
197 GetNodeController()->ConnectToPeer(std::move(pipe_handle), port1, peer_token); | 217 ConnectionParam connection_param(std::move(pipe_handle)); |
| 218 GetNodeController()->ConnectToPeer(std::move(connection_param), port1, |
| 219 peer_token); |
198 return ScopedMessagePipeHandle(MessagePipeHandle(handle)); | 220 return ScopedMessagePipeHandle(MessagePipeHandle(handle)); |
199 } | 221 } |
200 | 222 |
201 void Core::ClosePeerConnection(const std::string& peer_token) { | 223 void Core::ClosePeerConnection(const std::string& peer_token) { |
202 GetNodeController()->ClosePeerConnection(peer_token); | 224 GetNodeController()->ClosePeerConnection(peer_token); |
203 } | 225 } |
204 | 226 |
205 void Core::InitChild(ScopedPlatformHandle platform_handle) { | 227 void Core::InitChild(ConnectionParam connection_param) { |
206 GetNodeController()->ConnectToParent(std::move(platform_handle)); | 228 GetNodeController()->ConnectToParent(std::move(connection_param)); |
207 } | 229 } |
208 | 230 |
209 void Core::SetMachPortProvider(base::PortProvider* port_provider) { | 231 void Core::SetMachPortProvider(base::PortProvider* port_provider) { |
210 #if defined(OS_MACOSX) && !defined(OS_IOS) | 232 #if defined(OS_MACOSX) && !defined(OS_IOS) |
211 GetNodeController()->CreateMachPortRelay(port_provider); | 233 GetNodeController()->CreateMachPortRelay(port_provider); |
212 #endif | 234 #endif |
213 } | 235 } |
214 | 236 |
215 MojoHandle Core::AddDispatcher(scoped_refptr<Dispatcher> dispatcher) { | 237 MojoHandle Core::AddDispatcher(scoped_refptr<Dispatcher> dispatcher) { |
216 base::AutoLock lock(handles_lock_); | 238 base::AutoLock lock(handles_lock_); |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 uint32_t* num_bytes, | 702 uint32_t* num_bytes, |
681 MojoHandle* handles, | 703 MojoHandle* handles, |
682 uint32_t* num_handles, | 704 uint32_t* num_handles, |
683 MojoReadMessageFlags flags) { | 705 MojoReadMessageFlags flags) { |
684 CHECK((!num_handles || !*num_handles || handles) && | 706 CHECK((!num_handles || !*num_handles || handles) && |
685 (!num_bytes || !*num_bytes || bytes)); | 707 (!num_bytes || !*num_bytes || bytes)); |
686 RequestContext request_context; | 708 RequestContext request_context; |
687 auto dispatcher = GetDispatcher(message_pipe_handle); | 709 auto dispatcher = GetDispatcher(message_pipe_handle); |
688 if (!dispatcher) | 710 if (!dispatcher) |
689 return MOJO_RESULT_INVALID_ARGUMENT; | 711 return MOJO_RESULT_INVALID_ARGUMENT; |
| 712 |
690 std::unique_ptr<MessageForTransit> message; | 713 std::unique_ptr<MessageForTransit> message; |
691 MojoResult rv = | 714 MojoResult rv = |
692 dispatcher->ReadMessage(&message, num_bytes, handles, num_handles, flags, | 715 dispatcher->ReadMessage(&message, num_bytes, handles, num_handles, flags, |
693 false /* ignore_num_bytes */); | 716 false /* ignore_num_bytes */); |
694 if (rv != MOJO_RESULT_OK) | 717 if (rv != MOJO_RESULT_OK) |
695 return rv; | 718 return rv; |
696 | 719 |
697 if (message && message->num_bytes()) | 720 if (message && message->num_bytes()) |
698 memcpy(bytes, message->bytes(), message->num_bytes()); | 721 memcpy(bytes, message->bytes(), message->num_bytes()); |
699 | 722 |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1169 std::unique_ptr<NodeController> node_controller) { | 1192 std::unique_ptr<NodeController> node_controller) { |
1170 // It's OK to leak this reference. At this point we know the IO loop is still | 1193 // It's OK to leak this reference. At this point we know the IO loop is still |
1171 // running, and we know the NodeController will observe its eventual | 1194 // running, and we know the NodeController will observe its eventual |
1172 // destruction. This tells the NodeController to delete itself when that | 1195 // destruction. This tells the NodeController to delete itself when that |
1173 // happens. | 1196 // happens. |
1174 node_controller.release()->DestroyOnIOThreadShutdown(); | 1197 node_controller.release()->DestroyOnIOThreadShutdown(); |
1175 } | 1198 } |
1176 | 1199 |
1177 } // namespace edk | 1200 } // namespace edk |
1178 } // namespace mojo | 1201 } // namespace mojo |
OLD | NEW |