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

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

Issue 1943123002: Make it possible to write a message pipe endpoint's peer into it. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 7 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
OLDNEW
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_dispatcher.h" 5 #include "mojo/edk/system/message_pipe_dispatcher.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "mojo/edk/system/configuration.h" 10 #include "mojo/edk/system/configuration.h"
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 } 126 }
127 127
128 void MessagePipeDispatcher::CloseImplNoLock() { 128 void MessagePipeDispatcher::CloseImplNoLock() {
129 mutex().AssertHeld(); 129 mutex().AssertHeld();
130 message_pipe_->Close(port_); 130 message_pipe_->Close(port_);
131 message_pipe_ = nullptr; 131 message_pipe_ = nullptr;
132 port_ = kInvalidPort; 132 port_ = kInvalidPort;
133 } 133 }
134 134
135 RefPtr<Dispatcher> 135 RefPtr<Dispatcher>
136 MessagePipeDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() { 136 MessagePipeDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock(
137 MessagePipe* message_pipe,
138 unsigned port) {
137 mutex().AssertHeld(); 139 mutex().AssertHeld();
138 140
141 // "We" are being sent over our peer.
142 if (message_pipe == message_pipe_.get()) {
143 // A message pipe dispatcher can't be sent over itself (this should be
144 // disallowed by |Core|). Note that |port| is the destination port.
145 DCHECK_EQ(port, port_);
146 // In this case, |message_pipe_|'s mutex should already be held!
147 message_pipe_->CancelAllAwakablesNoLock(port_);
148 } else {
149 CancelAllAwakablesNoLock();
150 }
151
139 // TODO(vtl): Currently, there are no options, so we just use 152 // TODO(vtl): Currently, there are no options, so we just use
140 // |kDefaultCreateOptions|. Eventually, we'll have to duplicate the options 153 // |kDefaultCreateOptions|. Eventually, we'll have to duplicate the options
141 // too. 154 // too.
142 auto dispatcher = MessagePipeDispatcher::Create(kDefaultCreateOptions); 155 auto dispatcher = MessagePipeDispatcher::Create(kDefaultCreateOptions);
143 dispatcher->Init(std::move(message_pipe_), port_); 156 dispatcher->Init(std::move(message_pipe_), port_);
144 port_ = kInvalidPort; 157 port_ = kInvalidPort;
145 return dispatcher; 158 return dispatcher;
146 } 159 }
147 160
148 MojoResult MessagePipeDispatcher::WriteMessageImplNoLock( 161 MojoResult MessagePipeDispatcher::WriteMessageImplNoLock(
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 std::vector<ScopedPlatformHandle>* platform_handles) { 226 std::vector<ScopedPlatformHandle>* platform_handles) {
214 AssertHasOneRef(); // Only one ref => no need to take the lock. 227 AssertHasOneRef(); // Only one ref => no need to take the lock.
215 228
216 bool rv = message_pipe_->EndSerialize(port_, channel, destination, 229 bool rv = message_pipe_->EndSerialize(port_, channel, destination,
217 actual_size, platform_handles); 230 actual_size, platform_handles);
218 message_pipe_ = nullptr; 231 message_pipe_ = nullptr;
219 port_ = kInvalidPort; 232 port_ = kInvalidPort;
220 return rv; 233 return rv;
221 } 234 }
222 235
223 // MessagePipeDispatcherTransport ----------------------------------------------
224
225 MessagePipeDispatcherTransport::MessagePipeDispatcherTransport(
226 DispatcherTransport transport)
227 : DispatcherTransport(transport) {
228 DCHECK_EQ(message_pipe_dispatcher()->GetType(),
229 Dispatcher::Type::MESSAGE_PIPE);
230 }
231
232 } // namespace system 236 } // namespace system
233 } // namespace mojo 237 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698