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/data_pipe.h" | 5 #include "mojo/edk/system/data_pipe.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <limits> | 10 #include <limits> |
| 11 #include <memory> |
| 12 #include <utility> |
11 | 13 |
12 #include "base/logging.h" | 14 #include "base/logging.h" |
13 #include "base/memory/aligned_memory.h" | 15 #include "base/memory/aligned_memory.h" |
14 #include "mojo/edk/system/awakable_list.h" | 16 #include "mojo/edk/system/awakable_list.h" |
15 #include "mojo/edk/system/channel.h" | 17 #include "mojo/edk/system/channel.h" |
16 #include "mojo/edk/system/configuration.h" | 18 #include "mojo/edk/system/configuration.h" |
17 #include "mojo/edk/system/data_pipe_impl.h" | 19 #include "mojo/edk/system/data_pipe_impl.h" |
18 #include "mojo/edk/system/incoming_endpoint.h" | 20 #include "mojo/edk/system/incoming_endpoint.h" |
19 #include "mojo/edk/system/local_data_pipe_impl.h" | 21 #include "mojo/edk/system/local_data_pipe_impl.h" |
20 #include "mojo/edk/system/memory.h" | 22 #include "mojo/edk/system/memory.h" |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 const MojoCreateDataPipeOptions& validated_options) { | 97 const MojoCreateDataPipeOptions& validated_options) { |
96 return new DataPipe(true, true, validated_options, | 98 return new DataPipe(true, true, validated_options, |
97 make_scoped_ptr(new LocalDataPipeImpl())); | 99 make_scoped_ptr(new LocalDataPipeImpl())); |
98 } | 100 } |
99 | 101 |
100 // static | 102 // static |
101 DataPipe* DataPipe::CreateRemoteProducerFromExisting( | 103 DataPipe* DataPipe::CreateRemoteProducerFromExisting( |
102 const MojoCreateDataPipeOptions& validated_options, | 104 const MojoCreateDataPipeOptions& validated_options, |
103 MessageInTransitQueue* message_queue, | 105 MessageInTransitQueue* message_queue, |
104 ChannelEndpoint* channel_endpoint) { | 106 ChannelEndpoint* channel_endpoint) { |
105 scoped_ptr<char, base::AlignedFreeDeleter> buffer; | 107 std::unique_ptr<char, base::AlignedFreeDeleter> buffer; |
106 size_t buffer_num_bytes = 0; | 108 size_t buffer_num_bytes = 0; |
107 if (!RemoteProducerDataPipeImpl::ProcessMessagesFromIncomingEndpoint( | 109 if (!RemoteProducerDataPipeImpl::ProcessMessagesFromIncomingEndpoint( |
108 validated_options, message_queue, &buffer, &buffer_num_bytes)) | 110 validated_options, message_queue, &buffer, &buffer_num_bytes)) |
109 return nullptr; | 111 return nullptr; |
110 | 112 |
111 // Important: This is called under |IncomingEndpoint|'s (which is a | 113 // Important: This is called under |IncomingEndpoint|'s (which is a |
112 // |ChannelEndpointClient|) lock, in particular from | 114 // |ChannelEndpointClient|) lock, in particular from |
113 // |IncomingEndpoint::ConvertToDataPipeConsumer()|. Before releasing that | 115 // |IncomingEndpoint::ConvertToDataPipeConsumer()|. Before releasing that |
114 // lock, it will reset its |endpoint_| member, which makes any later or | 116 // lock, it will reset its |endpoint_| member, which makes any later or |
115 // ongoing call to |IncomingEndpoint::OnReadMessage()| return false. This will | 117 // ongoing call to |IncomingEndpoint::OnReadMessage()| return false. This will |
116 // make |ChannelEndpoint::OnReadMessage()| retry, until its |ReplaceClient()| | 118 // make |ChannelEndpoint::OnReadMessage()| retry, until its |ReplaceClient()| |
117 // is called. | 119 // is called. |
118 DataPipe* data_pipe = | 120 DataPipe* data_pipe = new DataPipe( |
119 new DataPipe(false, true, validated_options, | 121 false, true, validated_options, |
120 make_scoped_ptr(new RemoteProducerDataPipeImpl( | 122 make_scoped_ptr(new RemoteProducerDataPipeImpl( |
121 channel_endpoint, buffer.Pass(), 0, buffer_num_bytes))); | 123 channel_endpoint, std::move(buffer), 0, buffer_num_bytes))); |
122 if (channel_endpoint) { | 124 if (channel_endpoint) { |
123 if (!channel_endpoint->ReplaceClient(data_pipe, 0)) | 125 if (!channel_endpoint->ReplaceClient(data_pipe, 0)) |
124 data_pipe->OnDetachFromChannel(0); | 126 data_pipe->OnDetachFromChannel(0); |
125 } else { | 127 } else { |
126 data_pipe->SetProducerClosed(); | 128 data_pipe->SetProducerClosed(); |
127 } | 129 } |
128 return data_pipe; | 130 return data_pipe; |
129 } | 131 } |
130 | 132 |
131 // static | 133 // static |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 SetProducerClosedNoLock(); | 818 SetProducerClosedNoLock(); |
817 } | 819 } |
818 | 820 |
819 void DataPipe::SetConsumerClosed() { | 821 void DataPipe::SetConsumerClosed() { |
820 MutexLocker locker(&mutex_); | 822 MutexLocker locker(&mutex_); |
821 SetConsumerClosedNoLock(); | 823 SetConsumerClosedNoLock(); |
822 } | 824 } |
823 | 825 |
824 } // namespace system | 826 } // namespace system |
825 } // namespace mojo | 827 } // namespace mojo |
OLD | NEW |