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 #ifndef MOJO_PUBLIC_SYSTEM_CORE_CPP_H_ | 5 #ifndef MOJO_PUBLIC_SYSTEM_CORE_CPP_H_ |
6 #define MOJO_PUBLIC_SYSTEM_CORE_CPP_H_ | 6 #define MOJO_PUBLIC_SYSTEM_CORE_CPP_H_ |
7 | 7 |
8 #include <assert.h> | 8 #include <assert.h> |
| 9 #include <stddef.h> |
9 | 10 |
10 #include <limits> | 11 #include <limits> |
11 | 12 |
12 #include "mojo/public/system/core.h" | 13 #include "mojo/public/system/core.h" |
13 #include "mojo/public/system/macros.h" | 14 #include "mojo/public/system/macros.h" |
14 #include "mojo/public/system/system_export.h" | 15 #include "mojo/public/system/system_export.h" |
15 | 16 |
16 namespace mojo { | 17 namespace mojo { |
17 | 18 |
18 // Standalone functions -------------------------------------------------------- | 19 // Standalone functions -------------------------------------------------------- |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 assert(message_pipe1); | 193 assert(message_pipe1); |
193 MessagePipeHandle h0; | 194 MessagePipeHandle h0; |
194 MessagePipeHandle h1; | 195 MessagePipeHandle h1; |
195 MojoResult result MOJO_ALLOW_UNUSED = | 196 MojoResult result MOJO_ALLOW_UNUSED = |
196 MojoCreateMessagePipe(h0.mutable_value(), h1.mutable_value()); | 197 MojoCreateMessagePipe(h0.mutable_value(), h1.mutable_value()); |
197 assert(result == MOJO_RESULT_OK); | 198 assert(result == MOJO_RESULT_OK); |
198 message_pipe0->reset(h0); | 199 message_pipe0->reset(h0); |
199 message_pipe1->reset(h1); | 200 message_pipe1->reset(h1); |
200 } | 201 } |
201 | 202 |
| 203 // A wrapper class that automatically creates a message pipe and owns both |
| 204 // handles. |
202 class MessagePipe { | 205 class MessagePipe { |
203 public: | 206 public: |
204 MessagePipe(); | 207 MessagePipe(); |
205 ~MessagePipe(); | 208 ~MessagePipe(); |
206 | 209 |
207 ScopedMessagePipeHandle handle0; | 210 ScopedMessagePipeHandle handle0; |
208 ScopedMessagePipeHandle handle1; | 211 ScopedMessagePipeHandle handle1; |
209 }; | 212 }; |
210 | 213 |
211 inline MessagePipe::MessagePipe() { CreateMessagePipe(&handle0, &handle1); } | 214 inline MessagePipe::MessagePipe() { |
212 inline MessagePipe::~MessagePipe() {} | 215 CreateMessagePipe(&handle0, &handle1); |
| 216 } |
| 217 |
| 218 inline MessagePipe::~MessagePipe() { |
| 219 } |
213 | 220 |
214 // These "raw" versions fully expose the underlying API, but don't help with | 221 // These "raw" versions fully expose the underlying API, but don't help with |
215 // ownership of handles (especially when writing messages). | 222 // ownership of handles (especially when writing messages). |
216 // TODO(vtl): Write "baked" versions. | 223 // TODO(vtl): Write "baked" versions. |
217 inline MojoResult WriteMessageRaw(MessagePipeHandle message_pipe, | 224 inline MojoResult WriteMessageRaw(MessagePipeHandle message_pipe, |
218 const void* bytes, | 225 const void* bytes, |
219 uint32_t num_bytes, | 226 uint32_t num_bytes, |
220 const MojoHandle* handles, | 227 const MojoHandle* handles, |
221 uint32_t num_handles, | 228 uint32_t num_handles, |
222 MojoWriteMessageFlags flags) { | 229 MojoWriteMessageFlags flags) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 }; | 268 }; |
262 | 269 |
263 MOJO_COMPILE_ASSERT(sizeof(DataPipeConsumerHandle) == sizeof(Handle), | 270 MOJO_COMPILE_ASSERT(sizeof(DataPipeConsumerHandle) == sizeof(Handle), |
264 bad_size_for_cpp_DataPipeConsumerHandle); | 271 bad_size_for_cpp_DataPipeConsumerHandle); |
265 | 272 |
266 typedef ScopedHandleBase<DataPipeConsumerHandle> ScopedDataPipeConsumerHandle; | 273 typedef ScopedHandleBase<DataPipeConsumerHandle> ScopedDataPipeConsumerHandle; |
267 MOJO_COMPILE_ASSERT(sizeof(ScopedDataPipeConsumerHandle) == | 274 MOJO_COMPILE_ASSERT(sizeof(ScopedDataPipeConsumerHandle) == |
268 sizeof(DataPipeConsumerHandle), | 275 sizeof(DataPipeConsumerHandle), |
269 bad_size_for_cpp_ScopedDataPipeConsumerHandle); | 276 bad_size_for_cpp_ScopedDataPipeConsumerHandle); |
270 | 277 |
271 // TODO(vtl): Make more friendly wrappers (e.g., a create that doesn't "require" | |
272 // |options|; maybe templatized functions that are optimized for a particular | |
273 // "type" instead of some vague "element", or functions that take a "vector"). | |
274 inline MojoResult CreateDataPipe( | 278 inline MojoResult CreateDataPipe( |
275 const MojoCreateDataPipeOptions* options, | 279 const MojoCreateDataPipeOptions* options, |
276 ScopedDataPipeProducerHandle* data_pipe_producer, | 280 ScopedDataPipeProducerHandle* data_pipe_producer, |
277 ScopedDataPipeConsumerHandle* data_pipe_consumer) { | 281 ScopedDataPipeConsumerHandle* data_pipe_consumer) { |
278 assert(data_pipe_producer); | 282 assert(data_pipe_producer); |
279 assert(data_pipe_consumer); | 283 assert(data_pipe_consumer); |
280 DataPipeProducerHandle producer_handle; | 284 DataPipeProducerHandle producer_handle; |
281 DataPipeConsumerHandle consumer_handle; | 285 DataPipeConsumerHandle consumer_handle; |
282 MojoResult rv = MojoCreateDataPipe(options, | 286 MojoResult rv = MojoCreateDataPipe(options, |
283 producer_handle.mutable_value(), | 287 producer_handle.mutable_value(), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 MojoReadDataFlags flags) { | 326 MojoReadDataFlags flags) { |
323 return MojoBeginReadData(data_pipe_consumer.value(), buffer, buffer_num_bytes, | 327 return MojoBeginReadData(data_pipe_consumer.value(), buffer, buffer_num_bytes, |
324 flags); | 328 flags); |
325 } | 329 } |
326 | 330 |
327 inline MojoResult EndReadDataRaw(DataPipeConsumerHandle data_pipe_consumer, | 331 inline MojoResult EndReadDataRaw(DataPipeConsumerHandle data_pipe_consumer, |
328 uint32_t num_bytes_read) { | 332 uint32_t num_bytes_read) { |
329 return MojoEndReadData(data_pipe_consumer.value(), num_bytes_read); | 333 return MojoEndReadData(data_pipe_consumer.value(), num_bytes_read); |
330 } | 334 } |
331 | 335 |
| 336 // A wrapper class that automatically creates a data pipe and owns both handles. |
| 337 // TODO(vtl): Make an even more friendly version? (Maybe templatized for a |
| 338 // particular type instead of some "element"? Maybe functions that take |
| 339 // vectors?) |
| 340 class DataPipe { |
| 341 public: |
| 342 DataPipe(); |
| 343 explicit DataPipe(const MojoCreateDataPipeOptions& options); |
| 344 ~DataPipe(); |
| 345 |
| 346 ScopedDataPipeProducerHandle producer_handle; |
| 347 ScopedDataPipeConsumerHandle consumer_handle; |
| 348 }; |
| 349 |
| 350 inline DataPipe::DataPipe() { |
| 351 CreateDataPipe(NULL, &producer_handle, &consumer_handle); |
| 352 } |
| 353 |
| 354 inline DataPipe::DataPipe(const MojoCreateDataPipeOptions& options) { |
| 355 CreateDataPipe(&options, &producer_handle, &consumer_handle); |
| 356 } |
| 357 |
| 358 inline DataPipe::~DataPipe() { |
| 359 } |
| 360 |
332 } // namespace mojo | 361 } // namespace mojo |
333 | 362 |
334 #endif // MOJO_PUBLIC_SYSTEM_CORE_CPP_H_ | 363 #endif // MOJO_PUBLIC_SYSTEM_CORE_CPP_H_ |
OLD | NEW |