| Index: mojo/public/cpp/system/message_pipe.h
|
| diff --git a/mojo/public/cpp/system/message_pipe.h b/mojo/public/cpp/system/message_pipe.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..76ba300ae0c85ca757318912bfdbb962c8f6efb9
|
| --- /dev/null
|
| +++ b/mojo/public/cpp/system/message_pipe.h
|
| @@ -0,0 +1,103 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
|
| +#define MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
|
| +
|
| +#include <assert.h>
|
| +
|
| +#include "mojo/public/c/system/message_pipe.h"
|
| +#include "mojo/public/cpp/system/handle.h"
|
| +#include "mojo/public/cpp/system/macros.h"
|
| +
|
| +namespace mojo {
|
| +
|
| +// MessagePipeHandle -----------------------------------------------------------
|
| +
|
| +class MessagePipeHandle : public Handle {
|
| + public:
|
| + MessagePipeHandle() {}
|
| + explicit MessagePipeHandle(MojoHandle value) : Handle(value) {}
|
| +
|
| + // Copying and assignment allowed.
|
| +};
|
| +
|
| +MOJO_COMPILE_ASSERT(sizeof(MessagePipeHandle) == sizeof(Handle),
|
| + bad_size_for_cpp_MessagePipeHandle);
|
| +
|
| +typedef ScopedHandleBase<MessagePipeHandle> ScopedMessagePipeHandle;
|
| +MOJO_COMPILE_ASSERT(sizeof(ScopedMessagePipeHandle) ==
|
| + sizeof(MessagePipeHandle),
|
| + bad_size_for_cpp_ScopedMessagePipeHandle);
|
| +
|
| +inline MojoResult CreateMessagePipe(const MojoCreateMessagePipeOptions* options,
|
| + ScopedMessagePipeHandle* message_pipe0,
|
| + ScopedMessagePipeHandle* message_pipe1) {
|
| + assert(message_pipe0);
|
| + assert(message_pipe1);
|
| + MessagePipeHandle handle0;
|
| + MessagePipeHandle handle1;
|
| + MojoResult rv = MojoCreateMessagePipe(options,
|
| + handle0.mutable_value(),
|
| + handle1.mutable_value());
|
| + // Reset even on failure (reduces the chances that a "stale"/incorrect handle
|
| + // will be used).
|
| + message_pipe0->reset(handle0);
|
| + message_pipe1->reset(handle1);
|
| + return rv;
|
| +}
|
| +
|
| +// These "raw" versions fully expose the underlying API, but don't help with
|
| +// ownership of handles (especially when writing messages).
|
| +// TODO(vtl): Write "baked" versions.
|
| +inline MojoResult WriteMessageRaw(MessagePipeHandle message_pipe,
|
| + const void* bytes,
|
| + uint32_t num_bytes,
|
| + const MojoHandle* handles,
|
| + uint32_t num_handles,
|
| + MojoWriteMessageFlags flags) {
|
| + return MojoWriteMessage(message_pipe.value(), bytes, num_bytes, handles,
|
| + num_handles, flags);
|
| +}
|
| +
|
| +inline MojoResult ReadMessageRaw(MessagePipeHandle message_pipe,
|
| + void* bytes,
|
| + uint32_t* num_bytes,
|
| + MojoHandle* handles,
|
| + uint32_t* num_handles,
|
| + MojoReadMessageFlags flags) {
|
| + return MojoReadMessage(message_pipe.value(), bytes, num_bytes, handles,
|
| + num_handles, flags);
|
| +}
|
| +
|
| +// A wrapper class that automatically creates a message pipe and owns both
|
| +// handles.
|
| +class MessagePipe {
|
| + public:
|
| + MessagePipe();
|
| + explicit MessagePipe(const MojoCreateMessagePipeOptions& options);
|
| + ~MessagePipe();
|
| +
|
| + ScopedMessagePipeHandle handle0;
|
| + ScopedMessagePipeHandle handle1;
|
| +};
|
| +
|
| +inline MessagePipe::MessagePipe() {
|
| + MojoResult result MOJO_ALLOW_UNUSED =
|
| + CreateMessagePipe(NULL, &handle0, &handle1);
|
| + assert(result == MOJO_RESULT_OK);
|
| +}
|
| +
|
| +inline MessagePipe::MessagePipe(const MojoCreateMessagePipeOptions& options) {
|
| + MojoResult result MOJO_ALLOW_UNUSED =
|
| + CreateMessagePipe(&options, &handle0, &handle1);
|
| + assert(result == MOJO_RESULT_OK);
|
| +}
|
| +
|
| +inline MessagePipe::~MessagePipe() {
|
| +}
|
| +
|
| +} // namespace mojo
|
| +
|
| +#endif // MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
|
|
|