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/channel.h" | 5 #include "mojo/edk/system/channel.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "mojo/edk/embedder/platform_handle_vector.h" | 13 #include "mojo/edk/embedder/platform_handle_vector.h" |
14 #include "mojo/edk/system/endpoint_relayer.h" | 14 #include "mojo/edk/system/endpoint_relayer.h" |
15 #include "mojo/edk/system/transport_data.h" | 15 #include "mojo/edk/system/transport_data.h" |
16 | 16 |
| 17 using mojo::embedder::ScopedPlatformHandle; |
17 using mojo::util::MakeRefCounted; | 18 using mojo::util::MakeRefCounted; |
18 using mojo::util::MutexLocker; | 19 using mojo::util::MutexLocker; |
19 using mojo::util::RefPtr; | 20 using mojo::util::RefPtr; |
20 | 21 |
21 namespace mojo { | 22 namespace mojo { |
22 namespace system { | 23 namespace system { |
23 | 24 |
24 namespace { | 25 namespace { |
25 | 26 |
26 struct SerializedEndpoint { | 27 struct SerializedEndpoint { |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 if (it == local_id_to_endpoint_map_.end() || it->second.get() != endpoint) | 289 if (it == local_id_to_endpoint_map_.end() || it->second.get() != endpoint) |
289 return false; | 290 return false; |
290 | 291 |
291 DCHECK(it->second); | 292 DCHECK(it->second); |
292 it->second = nullptr; | 293 it->second = nullptr; |
293 return true; | 294 return true; |
294 } | 295 } |
295 | 296 |
296 void Channel::OnReadMessage( | 297 void Channel::OnReadMessage( |
297 const MessageInTransit::View& message_view, | 298 const MessageInTransit::View& message_view, |
298 embedder::ScopedPlatformHandleVectorPtr platform_handles) { | 299 std::unique_ptr<std::vector<ScopedPlatformHandle>> platform_handles) { |
299 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) | 300 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
300 DCHECK(thread_checker_.IsCreationThreadCurrent()); | 301 DCHECK(thread_checker_.IsCreationThreadCurrent()); |
301 #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) | 302 #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
302 | 303 |
303 switch (message_view.type()) { | 304 switch (message_view.type()) { |
304 case MessageInTransit::Type::ENDPOINT_CLIENT: | 305 case MessageInTransit::Type::ENDPOINT_CLIENT: |
305 case MessageInTransit::Type::ENDPOINT: | 306 case MessageInTransit::Type::ENDPOINT: |
306 OnReadMessageForEndpoint(message_view, std::move(platform_handles)); | 307 OnReadMessageForEndpoint(message_view, std::move(platform_handles)); |
307 break; | 308 break; |
308 case MessageInTransit::Type::CHANNEL: | 309 case MessageInTransit::Type::CHANNEL: |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 // Write errors are slightly notable: they probably shouldn't happen under | 346 // Write errors are slightly notable: they probably shouldn't happen under |
346 // normal operation (but maybe the other side crashed). | 347 // normal operation (but maybe the other side crashed). |
347 LOG(WARNING) << "RawChannel write error"; | 348 LOG(WARNING) << "RawChannel write error"; |
348 break; | 349 break; |
349 } | 350 } |
350 Shutdown(); | 351 Shutdown(); |
351 } | 352 } |
352 | 353 |
353 void Channel::OnReadMessageForEndpoint( | 354 void Channel::OnReadMessageForEndpoint( |
354 const MessageInTransit::View& message_view, | 355 const MessageInTransit::View& message_view, |
355 embedder::ScopedPlatformHandleVectorPtr platform_handles) { | 356 std::unique_ptr<std::vector<ScopedPlatformHandle>> platform_handles) { |
356 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) | 357 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
357 DCHECK(thread_checker_.IsCreationThreadCurrent()); | 358 DCHECK(thread_checker_.IsCreationThreadCurrent()); |
358 #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) | 359 #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
359 DCHECK(message_view.type() == MessageInTransit::Type::ENDPOINT_CLIENT || | 360 DCHECK(message_view.type() == MessageInTransit::Type::ENDPOINT_CLIENT || |
360 message_view.type() == MessageInTransit::Type::ENDPOINT); | 361 message_view.type() == MessageInTransit::Type::ENDPOINT); |
361 | 362 |
362 ChannelEndpointId local_id = message_view.destination_id(); | 363 ChannelEndpointId local_id = message_view.destination_id(); |
363 if (!local_id.is_valid()) { | 364 if (!local_id.is_valid()) { |
364 HandleRemoteError("Received message with no destination ID"); | 365 HandleRemoteError("Received message with no destination ID"); |
365 return; | 366 return; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 message_view.transport_data_buffer(), | 409 message_view.transport_data_buffer(), |
409 message_view.transport_data_buffer_size(), std::move(platform_handles), | 410 message_view.transport_data_buffer_size(), std::move(platform_handles), |
410 this)); | 411 this)); |
411 } | 412 } |
412 | 413 |
413 endpoint->OnReadMessage(std::move(message)); | 414 endpoint->OnReadMessage(std::move(message)); |
414 } | 415 } |
415 | 416 |
416 void Channel::OnReadMessageForChannel( | 417 void Channel::OnReadMessageForChannel( |
417 const MessageInTransit::View& message_view, | 418 const MessageInTransit::View& message_view, |
418 embedder::ScopedPlatformHandleVectorPtr platform_handles) { | 419 std::unique_ptr<std::vector<ScopedPlatformHandle>> platform_handles) { |
419 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) | 420 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
420 DCHECK(thread_checker_.IsCreationThreadCurrent()); | 421 DCHECK(thread_checker_.IsCreationThreadCurrent()); |
421 #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) | 422 #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
422 DCHECK_EQ(message_view.type(), MessageInTransit::Type::CHANNEL); | 423 DCHECK_EQ(message_view.type(), MessageInTransit::Type::CHANNEL); |
423 | 424 |
424 // Currently, no channel messages take platform handles. | 425 // Currently, no channel messages take platform handles. |
425 if (platform_handles) { | 426 if (platform_handles) { |
426 HandleRemoteError( | 427 HandleRemoteError( |
427 "Received invalid channel message (has platform handles)"); | 428 "Received invalid channel message (has platform handles)"); |
428 NOTREACHED(); | 429 NOTREACHED(); |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 << ", local ID " << local_id << ", remote ID " << remote_id; | 641 << ", local ID " << local_id << ", remote ID " << remote_id; |
641 std::unique_ptr<MessageInTransit> message(new MessageInTransit( | 642 std::unique_ptr<MessageInTransit> message(new MessageInTransit( |
642 MessageInTransit::Type::CHANNEL, subtype, num_bytes, bytes)); | 643 MessageInTransit::Type::CHANNEL, subtype, num_bytes, bytes)); |
643 message->set_source_id(local_id); | 644 message->set_source_id(local_id); |
644 message->set_destination_id(remote_id); | 645 message->set_destination_id(remote_id); |
645 return WriteMessage(std::move(message)); | 646 return WriteMessage(std::move(message)); |
646 } | 647 } |
647 | 648 |
648 } // namespace system | 649 } // namespace system |
649 } // namespace mojo | 650 } // namespace mojo |
OLD | NEW |