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

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

Issue 973513004: Allow data pipe producer/consumer handles to be re-sent. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: review comments Created 5 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/remote_consumer_data_pipe_impl.cc ('k') | no next file » | 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/remote_producer_data_pipe_impl.h" 5 #include "mojo/edk/system/remote_producer_data_pipe_impl.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "mojo/edk/system/channel.h"
13 #include "mojo/edk/system/channel_endpoint.h" 14 #include "mojo/edk/system/channel_endpoint.h"
14 #include "mojo/edk/system/configuration.h" 15 #include "mojo/edk/system/configuration.h"
15 #include "mojo/edk/system/data_pipe.h" 16 #include "mojo/edk/system/data_pipe.h"
16 #include "mojo/edk/system/message_in_transit.h" 17 #include "mojo/edk/system/message_in_transit.h"
17 #include "mojo/edk/system/message_in_transit_queue.h" 18 #include "mojo/edk/system/message_in_transit_queue.h"
18 #include "mojo/edk/system/remote_consumer_data_pipe_impl.h" 19 #include "mojo/edk/system/remote_consumer_data_pipe_impl.h"
19 #include "mojo/edk/system/remote_data_pipe_ack.h" 20 #include "mojo/edk/system/remote_data_pipe_ack.h"
20 21
21 namespace mojo { 22 namespace mojo {
22 namespace system { 23 namespace system {
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 if (!producer_open()) 296 if (!producer_open())
296 rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED; 297 rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
297 rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED; 298 rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
298 return rv; 299 return rv;
299 } 300 }
300 301
301 void RemoteProducerDataPipeImpl::ConsumerStartSerialize( 302 void RemoteProducerDataPipeImpl::ConsumerStartSerialize(
302 Channel* channel, 303 Channel* channel,
303 size_t* max_size, 304 size_t* max_size,
304 size_t* max_platform_handles) { 305 size_t* max_platform_handles) {
305 // TODO(vtl): Support serializing consumer data pipe handles. 306 *max_size = sizeof(SerializedDataPipeConsumerDispatcher) +
306 NOTIMPLEMENTED(); // FIXME 307 channel->GetSerializedEndpointSize();
307 *max_size = 0;
308 *max_platform_handles = 0; 308 *max_platform_handles = 0;
309 } 309 }
310 310
311 bool RemoteProducerDataPipeImpl::ConsumerEndSerialize( 311 bool RemoteProducerDataPipeImpl::ConsumerEndSerialize(
312 Channel* channel, 312 Channel* channel,
313 void* destination, 313 void* destination,
314 size_t* actual_size, 314 size_t* actual_size,
315 embedder::PlatformHandleVector* platform_handles) { 315 embedder::PlatformHandleVector* platform_handles) {
316 // TODO(vtl): Support serializing consumer data pipe handles. 316 SerializedDataPipeConsumerDispatcher* s =
317 NOTIMPLEMENTED(); // FIXME 317 static_cast<SerializedDataPipeConsumerDispatcher*>(destination);
318 owner()->ConsumerCloseNoLock(); 318 s->validated_options = validated_options();
319 return false; 319 void* destination_for_endpoint = static_cast<char*>(destination) +
320 sizeof(SerializedDataPipeConsumerDispatcher);
321
322 MessageInTransitQueue message_queue;
323 ConvertDataToMessages(buffer_.get(), &start_index_, &current_num_bytes_,
324 &message_queue);
325
326 if (!producer_open()) {
327 // Case 1: The producer is closed.
328 channel->SerializeEndpointWithClosedPeer(destination_for_endpoint,
329 &message_queue);
330 *actual_size = sizeof(SerializedDataPipeConsumerDispatcher) +
331 channel->GetSerializedEndpointSize();
332 return true;
333 }
334
335 // Case 2: The producer isn't closed. We pass |channel_endpoint| back to the
336 // |Channel|. There's no reason for us to continue to exist afterwards.
337
338 // Note: We don't use |port|.
339 scoped_refptr<ChannelEndpoint> channel_endpoint;
340 channel_endpoint.swap(channel_endpoint_);
341 channel->SerializeEndpointWithRemotePeer(destination_for_endpoint,
342 &message_queue, channel_endpoint);
343 owner()->SetProducerClosedNoLock();
344
345 *actual_size = sizeof(SerializedDataPipeConsumerDispatcher) +
346 channel->GetSerializedEndpointSize();
347 return true;
320 } 348 }
321 349
322 bool RemoteProducerDataPipeImpl::OnReadMessage(unsigned /*port*/, 350 bool RemoteProducerDataPipeImpl::OnReadMessage(unsigned /*port*/,
323 MessageInTransit* message) { 351 MessageInTransit* message) {
324 // Always take ownership of the message. (This means that we should always 352 // Always take ownership of the message. (This means that we should always
325 // return true.) 353 // return true.)
326 scoped_ptr<MessageInTransit> msg(message); 354 scoped_ptr<MessageInTransit> msg(message);
327 355
328 if (!producer_open()) { 356 if (!producer_open()) {
329 DCHECK(!channel_endpoint_); 357 DCHECK(!channel_endpoint_);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 if (!consumer_open() || !current_num_bytes_) { 466 if (!consumer_open() || !current_num_bytes_) {
439 // Note: There can only be a two-phase *read* (by the consumer) if we still 467 // Note: There can only be a two-phase *read* (by the consumer) if we still
440 // have data. 468 // have data.
441 DCHECK(!consumer_in_two_phase_read()); 469 DCHECK(!consumer_in_two_phase_read());
442 DestroyBuffer(); 470 DestroyBuffer();
443 } 471 }
444 } 472 }
445 473
446 } // namespace system 474 } // namespace system
447 } // namespace mojo 475 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/remote_consumer_data_pipe_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698