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

Side by Side Diff: mojo/edk/system/message_pipe_dispatcher.cc

Issue 2735113003: Changing SpawnChild to return a struct.
Patch Set: Created 3 years, 9 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
« no previous file with comments | « mojo/edk/system/core.cc ('k') | mojo/edk/system/multiprocess_message_pipe_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "mojo/edk/system/message_pipe_dispatcher.h" 5 #include "mojo/edk/system/message_pipe_dispatcher.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 // that it specifies a size at least as large as the next available payload. 279 // that it specifies a size at least as large as the next available payload.
280 // 280 //
281 // If |read_any_size| is true, the input value of |*num_bytes| is ignored. 281 // If |read_any_size| is true, the input value of |*num_bytes| is ignored.
282 // This flag exists to support both new and old API behavior. 282 // This flag exists to support both new and old API behavior.
283 283
284 ports::ScopedMessage ports_message; 284 ports::ScopedMessage ports_message;
285 ReadMessageFilter filter(read_any_size, may_discard, num_bytes, num_handles, 285 ReadMessageFilter filter(read_any_size, may_discard, num_bytes, num_handles,
286 &no_space, &invalid_message); 286 &no_space, &invalid_message);
287 int rv = node_controller_->node()->GetMessage(port_, &ports_message, &filter); 287 int rv = node_controller_->node()->GetMessage(port_, &ports_message, &filter);
288 288
289 if (invalid_message) 289 if (invalid_message) {
290 NOTREACHED();
290 return MOJO_RESULT_UNKNOWN; 291 return MOJO_RESULT_UNKNOWN;
292 }
291 293
292 if (rv != ports::OK && rv != ports::ERROR_PORT_PEER_CLOSED) { 294 if (rv != ports::OK && rv != ports::ERROR_PORT_PEER_CLOSED) {
293 if (rv == ports::ERROR_PORT_UNKNOWN || 295 if (rv == ports::ERROR_PORT_UNKNOWN ||
294 rv == ports::ERROR_PORT_STATE_UNEXPECTED) 296 rv == ports::ERROR_PORT_STATE_UNEXPECTED)
295 return MOJO_RESULT_INVALID_ARGUMENT; 297 return MOJO_RESULT_INVALID_ARGUMENT;
296 298
297 NOTREACHED(); 299 NOTREACHED();
298 return MOJO_RESULT_UNKNOWN; // TODO: Add a better error code here? 300 return MOJO_RESULT_UNKNOWN; // TODO: Add a better error code here?
299 } 301 }
300 302
(...skipping 19 matching lines...) Expand all
320 // in which to receive it. 322 // in which to receive it.
321 323
322 std::unique_ptr<PortsMessage> msg( 324 std::unique_ptr<PortsMessage> msg(
323 static_cast<PortsMessage*>(ports_message.release())); 325 static_cast<PortsMessage*>(ports_message.release()));
324 326
325 const MessageHeader* header = 327 const MessageHeader* header =
326 static_cast<const MessageHeader*>(msg->payload_bytes()); 328 static_cast<const MessageHeader*>(msg->payload_bytes());
327 const DispatcherHeader* dispatcher_headers = 329 const DispatcherHeader* dispatcher_headers =
328 reinterpret_cast<const DispatcherHeader*>(header + 1); 330 reinterpret_cast<const DispatcherHeader*>(header + 1);
329 331
330 if (header->num_dispatchers > std::numeric_limits<uint16_t>::max()) 332 if (header->num_dispatchers > std::numeric_limits<uint16_t>::max()) {
333 NOTREACHED();
331 return MOJO_RESULT_UNKNOWN; 334 return MOJO_RESULT_UNKNOWN;
335 }
332 336
333 // Deserialize dispatchers. 337 // Deserialize dispatchers.
334 if (header->num_dispatchers > 0) { 338 if (header->num_dispatchers > 0) {
335 CHECK(handles); 339 CHECK(handles);
336 std::vector<DispatcherInTransit> dispatchers(header->num_dispatchers); 340 std::vector<DispatcherInTransit> dispatchers(header->num_dispatchers);
337 size_t data_payload_index = sizeof(MessageHeader) + 341 size_t data_payload_index = sizeof(MessageHeader) +
338 header->num_dispatchers * sizeof(DispatcherHeader); 342 header->num_dispatchers * sizeof(DispatcherHeader);
339 if (data_payload_index > header->header_size) 343 if (data_payload_index > header->header_size) {
344 NOTREACHED();
340 return MOJO_RESULT_UNKNOWN; 345 return MOJO_RESULT_UNKNOWN;
346 }
341 const char* dispatcher_data = reinterpret_cast<const char*>( 347 const char* dispatcher_data = reinterpret_cast<const char*>(
342 dispatcher_headers + header->num_dispatchers); 348 dispatcher_headers + header->num_dispatchers);
343 size_t port_index = 0; 349 size_t port_index = 0;
344 size_t platform_handle_index = 0; 350 size_t platform_handle_index = 0;
345 ScopedPlatformHandleVectorPtr msg_handles = msg->TakeHandles(); 351 ScopedPlatformHandleVectorPtr msg_handles = msg->TakeHandles();
346 const size_t num_msg_handles = msg_handles ? msg_handles->size() : 0; 352 const size_t num_msg_handles = msg_handles ? msg_handles->size() : 0;
347 for (size_t i = 0; i < header->num_dispatchers; ++i) { 353 for (size_t i = 0; i < header->num_dispatchers; ++i) {
348 const DispatcherHeader& dh = dispatcher_headers[i]; 354 const DispatcherHeader& dh = dispatcher_headers[i];
349 Type type = static_cast<Type>(dh.type); 355 Type type = static_cast<Type>(dh.type);
350 356
351 size_t next_payload_index = data_payload_index + dh.num_bytes; 357 size_t next_payload_index = data_payload_index + dh.num_bytes;
352 if (msg->num_payload_bytes() < next_payload_index || 358 if (msg->num_payload_bytes() < next_payload_index ||
353 next_payload_index < data_payload_index) { 359 next_payload_index < data_payload_index) {
360 NOTREACHED();
354 return MOJO_RESULT_UNKNOWN; 361 return MOJO_RESULT_UNKNOWN;
355 } 362 }
356 363
357 size_t next_port_index = port_index + dh.num_ports; 364 size_t next_port_index = port_index + dh.num_ports;
358 if (msg->num_ports() < next_port_index || next_port_index < port_index) 365 if (msg->num_ports() < next_port_index || next_port_index < port_index) {
366 NOTREACHED();
359 return MOJO_RESULT_UNKNOWN; 367 return MOJO_RESULT_UNKNOWN;
368 }
360 369
361 size_t next_platform_handle_index = 370 size_t next_platform_handle_index =
362 platform_handle_index + dh.num_platform_handles; 371 platform_handle_index + dh.num_platform_handles;
363 if (num_msg_handles < next_platform_handle_index || 372 if (num_msg_handles < next_platform_handle_index ||
364 next_platform_handle_index < platform_handle_index) { 373 next_platform_handle_index < platform_handle_index) {
374 NOTREACHED();
365 return MOJO_RESULT_UNKNOWN; 375 return MOJO_RESULT_UNKNOWN;
366 } 376 }
367 377
368 PlatformHandle* out_handles = 378 PlatformHandle* out_handles =
369 num_msg_handles ? msg_handles->data() + platform_handle_index 379 num_msg_handles ? msg_handles->data() + platform_handle_index
370 : nullptr; 380 : nullptr;
371 dispatchers[i].dispatcher = Dispatcher::Deserialize( 381 dispatchers[i].dispatcher = Dispatcher::Deserialize(
372 type, dispatcher_data, dh.num_bytes, msg->ports() + port_index, 382 type, dispatcher_data, dh.num_bytes, msg->ports() + port_index,
373 dh.num_ports, out_handles, dh.num_platform_handles); 383 dh.num_ports, out_handles, dh.num_platform_handles);
374 if (!dispatchers[i].dispatcher) 384 if (!dispatchers[i].dispatcher) {
385 NOTREACHED();
375 return MOJO_RESULT_UNKNOWN; 386 return MOJO_RESULT_UNKNOWN;
387 }
376 388
377 dispatcher_data += dh.num_bytes; 389 dispatcher_data += dh.num_bytes;
378 data_payload_index = next_payload_index; 390 data_payload_index = next_payload_index;
379 port_index = next_port_index; 391 port_index = next_port_index;
380 platform_handle_index = next_platform_handle_index; 392 platform_handle_index = next_platform_handle_index;
381 } 393 }
382 394
383 if (!node_controller_->core()->AddDispatchersFromTransit(dispatchers, 395 if (!node_controller_->core()->AddDispatchersFromTransit(dispatchers,
384 handles)) 396 handles)) {
397 NOTREACHED();
385 return MOJO_RESULT_UNKNOWN; 398 return MOJO_RESULT_UNKNOWN;
399 }
386 } 400 }
387 401
388 CHECK(msg); 402 CHECK(msg);
389 *message = MessageForTransit::WrapPortsMessage(std::move(msg)); 403 *message = MessageForTransit::WrapPortsMessage(std::move(msg));
390 return MOJO_RESULT_OK; 404 return MOJO_RESULT_OK;
391 } 405 }
392 406
393 HandleSignalsState 407 HandleSignalsState
394 MessagePipeDispatcher::GetHandleSignalsState() const { 408 MessagePipeDispatcher::GetHandleSignalsState() const {
395 base::AutoLock lock(signal_lock_); 409 base::AutoLock lock(signal_lock_);
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 << " endpoint " << endpoint_ << " [port=" << port_.name() << "]"; 608 << " endpoint " << endpoint_ << " [port=" << port_.name() << "]";
595 } 609 }
596 } 610 }
597 #endif 611 #endif
598 612
599 awakables_.AwakeForStateChange(GetHandleSignalsStateNoLock()); 613 awakables_.AwakeForStateChange(GetHandleSignalsStateNoLock());
600 } 614 }
601 615
602 } // namespace edk 616 } // namespace edk
603 } // namespace mojo 617 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/core.cc ('k') | mojo/edk/system/multiprocess_message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698