| 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/message_pipe.h" | 5 #include "mojo/edk/system/message_pipe.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "mojo/edk/system/channel.h" | 11 #include "mojo/edk/system/channel.h" |
| 11 #include "mojo/edk/system/channel_endpoint.h" | 12 #include "mojo/edk/system/channel_endpoint.h" |
| 12 #include "mojo/edk/system/channel_endpoint_id.h" | 13 #include "mojo/edk/system/channel_endpoint_id.h" |
| 13 #include "mojo/edk/system/incoming_endpoint.h" | 14 #include "mojo/edk/system/incoming_endpoint.h" |
| 14 #include "mojo/edk/system/local_message_pipe_endpoint.h" | 15 #include "mojo/edk/system/local_message_pipe_endpoint.h" |
| 15 #include "mojo/edk/system/message_in_transit.h" | 16 #include "mojo/edk/system/message_in_transit.h" |
| 16 #include "mojo/edk/system/message_pipe_dispatcher.h" | 17 #include "mojo/edk/system/message_pipe_dispatcher.h" |
| 17 #include "mojo/edk/system/message_pipe_endpoint.h" | 18 #include "mojo/edk/system/message_pipe_endpoint.h" |
| 18 #include "mojo/edk/system/proxy_message_pipe_endpoint.h" | 19 #include "mojo/edk/system/proxy_message_pipe_endpoint.h" |
| 20 #include "mojo/edk/util/make_unique.h" |
| 19 | 21 |
| 20 namespace mojo { | 22 namespace mojo { |
| 21 namespace system { | 23 namespace system { |
| 22 | 24 |
| 23 // static | 25 // static |
| 24 MessagePipe* MessagePipe::CreateLocalLocal() MOJO_NO_THREAD_SAFETY_ANALYSIS { | 26 MessagePipe* MessagePipe::CreateLocalLocal() MOJO_NO_THREAD_SAFETY_ANALYSIS { |
| 25 MessagePipe* message_pipe = new MessagePipe(); | 27 MessagePipe* message_pipe = new MessagePipe(); |
| 26 message_pipe->endpoints_[0].reset(new LocalMessagePipeEndpoint()); | 28 message_pipe->endpoints_[0].reset(new LocalMessagePipeEndpoint()); |
| 27 message_pipe->endpoints_[1].reset(new LocalMessagePipeEndpoint()); | 29 message_pipe->endpoints_[1].reset(new LocalMessagePipeEndpoint()); |
| 28 return message_pipe; | 30 return message_pipe; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 unsigned port, | 150 unsigned port, |
| 149 UserPointer<const void> bytes, | 151 UserPointer<const void> bytes, |
| 150 uint32_t num_bytes, | 152 uint32_t num_bytes, |
| 151 std::vector<DispatcherTransport>* transports, | 153 std::vector<DispatcherTransport>* transports, |
| 152 MojoWriteMessageFlags flags) { | 154 MojoWriteMessageFlags flags) { |
| 153 DCHECK(port == 0 || port == 1); | 155 DCHECK(port == 0 || port == 1); |
| 154 | 156 |
| 155 MutexLocker locker(&mutex_); | 157 MutexLocker locker(&mutex_); |
| 156 return EnqueueMessageNoLock( | 158 return EnqueueMessageNoLock( |
| 157 GetPeerPort(port), | 159 GetPeerPort(port), |
| 158 make_scoped_ptr(new MessageInTransit( | 160 util::MakeUnique<MessageInTransit>( |
| 159 MessageInTransit::Type::ENDPOINT_CLIENT, | 161 MessageInTransit::Type::ENDPOINT_CLIENT, |
| 160 MessageInTransit::Subtype::ENDPOINT_CLIENT_DATA, num_bytes, bytes)), | 162 MessageInTransit::Subtype::ENDPOINT_CLIENT_DATA, num_bytes, bytes), |
| 161 transports); | 163 transports); |
| 162 } | 164 } |
| 163 | 165 |
| 164 MojoResult MessagePipe::ReadMessage(unsigned port, | 166 MojoResult MessagePipe::ReadMessage(unsigned port, |
| 165 UserPointer<void> bytes, | 167 UserPointer<void> bytes, |
| 166 UserPointer<uint32_t> num_bytes, | 168 UserPointer<uint32_t> num_bytes, |
| 167 DispatcherVector* dispatchers, | 169 DispatcherVector* dispatchers, |
| 168 uint32_t* num_dispatchers, | 170 uint32_t* num_dispatchers, |
| 169 MojoReadMessageFlags flags) { | 171 MojoReadMessageFlags flags) { |
| 170 DCHECK(port == 0 || port == 1); | 172 DCHECK(port == 0 || port == 1); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 // |ChannelEndpoint::ReplaceClient()|, in which case we reject the message, | 288 // |ChannelEndpoint::ReplaceClient()|, in which case we reject the message, |
| 287 // and the |ChannelEndpoint| can retry (calling the new client's | 289 // and the |ChannelEndpoint| can retry (calling the new client's |
| 288 // |OnReadMessage()|). | 290 // |OnReadMessage()|). |
| 289 return false; | 291 return false; |
| 290 } | 292 } |
| 291 | 293 |
| 292 // This is called when the |ChannelEndpoint| for the | 294 // This is called when the |ChannelEndpoint| for the |
| 293 // |ProxyMessagePipeEndpoint| |port| receives a message (from the |Channel|). | 295 // |ProxyMessagePipeEndpoint| |port| receives a message (from the |Channel|). |
| 294 // We need to pass this message on to its peer port (typically a | 296 // We need to pass this message on to its peer port (typically a |
| 295 // |LocalMessagePipeEndpoint|). | 297 // |LocalMessagePipeEndpoint|). |
| 296 MojoResult result = EnqueueMessageNoLock(GetPeerPort(port), | 298 MojoResult result = EnqueueMessageNoLock( |
| 297 make_scoped_ptr(message), nullptr); | 299 GetPeerPort(port), std::unique_ptr<MessageInTransit>(message), nullptr); |
| 298 DLOG_IF(WARNING, result != MOJO_RESULT_OK) | 300 DLOG_IF(WARNING, result != MOJO_RESULT_OK) |
| 299 << "EnqueueMessageNoLock() failed (result = " << result << ")"; | 301 << "EnqueueMessageNoLock() failed (result = " << result << ")"; |
| 300 return true; | 302 return true; |
| 301 } | 303 } |
| 302 | 304 |
| 303 void MessagePipe::OnDetachFromChannel(unsigned port) { | 305 void MessagePipe::OnDetachFromChannel(unsigned port) { |
| 304 Close(port); | 306 Close(port); |
| 305 } | 307 } |
| 306 | 308 |
| 307 MessagePipe::MessagePipe() { | 309 MessagePipe::MessagePipe() { |
| 308 } | 310 } |
| 309 | 311 |
| 310 MessagePipe::~MessagePipe() { | 312 MessagePipe::~MessagePipe() { |
| 311 // Owned by the dispatchers. The owning dispatchers should only release us via | 313 // Owned by the dispatchers. The owning dispatchers should only release us via |
| 312 // their |Close()| method, which should inform us of being closed via our | 314 // their |Close()| method, which should inform us of being closed via our |
| 313 // |Close()|. Thus these should already be null. | 315 // |Close()|. Thus these should already be null. |
| 314 DCHECK(!endpoints_[0]); | 316 DCHECK(!endpoints_[0]); |
| 315 DCHECK(!endpoints_[1]); | 317 DCHECK(!endpoints_[1]); |
| 316 } | 318 } |
| 317 | 319 |
| 318 MojoResult MessagePipe::EnqueueMessageNoLock( | 320 MojoResult MessagePipe::EnqueueMessageNoLock( |
| 319 unsigned port, | 321 unsigned port, |
| 320 scoped_ptr<MessageInTransit> message, | 322 std::unique_ptr<MessageInTransit> message, |
| 321 std::vector<DispatcherTransport>* transports) { | 323 std::vector<DispatcherTransport>* transports) { |
| 322 DCHECK(port == 0 || port == 1); | 324 DCHECK(port == 0 || port == 1); |
| 323 DCHECK(message); | 325 DCHECK(message); |
| 324 | 326 |
| 325 DCHECK_EQ(message->type(), MessageInTransit::Type::ENDPOINT_CLIENT); | 327 DCHECK_EQ(message->type(), MessageInTransit::Type::ENDPOINT_CLIENT); |
| 326 DCHECK(endpoints_[GetPeerPort(port)]); | 328 DCHECK(endpoints_[GetPeerPort(port)]); |
| 327 | 329 |
| 328 // The destination port need not be open, unlike the source port. | 330 // The destination port need not be open, unlike the source port. |
| 329 if (!endpoints_[port]) | 331 if (!endpoints_[port]) |
| 330 return MOJO_RESULT_FAILED_PRECONDITION; | 332 return MOJO_RESULT_FAILED_PRECONDITION; |
| 331 | 333 |
| 332 if (transports) { | 334 if (transports) { |
| 333 MojoResult result = AttachTransportsNoLock(port, message.get(), transports); | 335 MojoResult result = AttachTransportsNoLock(port, message.get(), transports); |
| 334 if (result != MOJO_RESULT_OK) | 336 if (result != MOJO_RESULT_OK) |
| 335 return result; | 337 return result; |
| 336 } | 338 } |
| 337 | 339 |
| 338 // The endpoint's |EnqueueMessage()| may not report failure. | 340 // The endpoint's |EnqueueMessage()| may not report failure. |
| 339 endpoints_[port]->EnqueueMessage(message.Pass()); | 341 endpoints_[port]->EnqueueMessage(std::move(message)); |
| 340 return MOJO_RESULT_OK; | 342 return MOJO_RESULT_OK; |
| 341 } | 343 } |
| 342 | 344 |
| 343 MojoResult MessagePipe::AttachTransportsNoLock( | 345 MojoResult MessagePipe::AttachTransportsNoLock( |
| 344 unsigned port, | 346 unsigned port, |
| 345 MessageInTransit* message, | 347 MessageInTransit* message, |
| 346 std::vector<DispatcherTransport>* transports) { | 348 std::vector<DispatcherTransport>* transports) { |
| 347 DCHECK(!message->has_dispatchers()); | 349 DCHECK(!message->has_dispatchers()); |
| 348 | 350 |
| 349 // You're not allowed to send either handle to a message pipe over the message | 351 // You're not allowed to send either handle to a message pipe over the message |
| (...skipping 29 matching lines...) Expand all Loading... |
| 379 LOG(WARNING) << "Enqueueing null dispatcher"; | 381 LOG(WARNING) << "Enqueueing null dispatcher"; |
| 380 dispatchers->push_back(nullptr); | 382 dispatchers->push_back(nullptr); |
| 381 } | 383 } |
| 382 } | 384 } |
| 383 message->SetDispatchers(std::move(dispatchers)); | 385 message->SetDispatchers(std::move(dispatchers)); |
| 384 return MOJO_RESULT_OK; | 386 return MOJO_RESULT_OK; |
| 385 } | 387 } |
| 386 | 388 |
| 387 } // namespace system | 389 } // namespace system |
| 388 } // namespace mojo | 390 } // namespace mojo |
| OLD | NEW |