1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This file contains types/constants and functions specific to message pipes.
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Note: This header should be compilable as C.
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/c/system/macros.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/public/c/system/system_export.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/public/c/system/types.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// |MojoCreateMessagePipeOptions|: Used to specify creation parameters for a
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// message pipe to |MojoCreateMessagePipe()|.
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//   |uint32_t struct_size|: Set to the size of the
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//       |MojoCreateMessagePipeOptions| struct. (Used to allow for future
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//       extensions.)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//   |MojoCreateMessagePipeOptionsFlags flags|: Reserved for future use.
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//       |MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef uint32_t MojoCreateMessagePipeOptionsFlags;
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifdef __cplusplus
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const MojoCreateMessagePipeOptionsFlags
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE = 0;
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE \
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ((MojoCreateMessagePipeOptionsFlags)0)
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MOJO_COMPILE_ASSERT(MOJO_ALIGNOF(int64_t) == 8, int64_t_has_weird_alignment);
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct MOJO_ALIGNAS(8) MojoCreateMessagePipeOptions {
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32_t struct_size;
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MojoCreateMessagePipeOptionsFlags flags;
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MOJO_COMPILE_ASSERT(sizeof(MojoCreateMessagePipeOptions) == 8,
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    MojoCreateMessagePipeOptions_has_wrong_size);
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |MojoWriteMessageFlags|: Used to specify different modes to
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |MojoWriteMessage()|.
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_WRITE_MESSAGE_FLAG_NONE| - No flags; default mode.
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef uint32_t MojoWriteMessageFlags;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef __cplusplus
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const MojoWriteMessageFlags MOJO_WRITE_MESSAGE_FLAG_NONE = 0;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MOJO_WRITE_MESSAGE_FLAG_NONE ((MojoWriteMessageFlags)0)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |MojoReadMessageFlags|: Used to specify different modes to
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |MojoReadMessage()|.
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_READ_MESSAGE_FLAG_NONE| - No flags; default mode.
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| - If the message is unable to be read
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       for whatever reason (e.g., the caller-supplied buffer is too small),
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       discard the message (i.e., simply dequeue it).
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef uint32_t MojoReadMessageFlags;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef __cplusplus
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_NONE = 0;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_MAY_DISCARD = 1 << 0;
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MOJO_READ_MESSAGE_FLAG_NONE ((MojoReadMessageFlags)0)
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MOJO_READ_MESSAGE_FLAG_MAY_DISCARD ((MojoReadMessageFlags)1 << 0)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef __cplusplus
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)extern "C" {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Note: See the comment in functions.h about the meaning of the "optional"
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// label for pointer parameters.
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Creates a message pipe, which is a bidirectional communication channel for
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// framed data (i.e., messages). Messages can contain plain data and/or Mojo
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// handles.
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// |options| may be set to null for a message pipe with the default options.
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// On success, |*message_pipe_handle0| and |*message_pipe_handle1| are set to
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// handles for the two endpoints (ports) for the message pipe.
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Returns:
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_OK| on success.
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//       |*options| is invalid).
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       been reached.
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(vtl): Add an options struct pointer argument.
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MOJO_SYSTEM_EXPORT MojoResult MojoCreateMessagePipe(
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const struct MojoCreateMessagePipeOptions* options,  // Optional.
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MojoHandle* message_pipe_handle0,                    // Out.
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MojoHandle* message_pipe_handle1);                   // Out.
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Writes a message to the message pipe endpoint given by |message_pipe_handle|,
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// with message data specified by |bytes| of size |num_bytes| and attached
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// handles specified by |handles| of count |num_handles|, and options specified
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// by |flags|. If there is no message data, |bytes| may be null, in which case
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |num_bytes| must be zero. If there are no attached handles, |handles| may be
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// null, in which case |num_handles| must be zero.
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// If handles are attached, on success the handles will no longer be valid (the
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// receiver will receive equivalent, but logically different, handles). Handles
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// to be sent should not be in simultaneous use (e.g., on another thread).
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Returns:
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_OK| on success (i.e., the message was enqueued).
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g., if
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       |message_pipe_handle| is not a valid handle, or some of the
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       requirements above are not satisfied).
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if some system limit has been reached, or
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       the number of handles to send is too large (TODO(vtl): reconsider the
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       latter case).
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed.
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       Note that closing an endpoint is not necessarily synchronous (e.g.,
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       across processes), so this function may be succeed even if the other
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       endpoint has been closed (in which case the message would be dropped).
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_BUSY| if some handle to be sent is currently in use.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(vtl): Add a notion of capacity for message pipes, and return
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |MOJO_RESULT_SHOULD_WAIT| if the message pipe is full.
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MOJO_SYSTEM_EXPORT MojoResult
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MojoWriteMessage(MojoHandle message_pipe_handle,
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     const void* bytes,  // Optional.
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     uint32_t num_bytes,
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     const MojoHandle* handles,  // Optional.
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     uint32_t num_handles,
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     MojoWriteMessageFlags flags);
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Reads a message from the message pipe endpoint given by
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |message_pipe_handle|; also usable to query the size of the next message or
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// discard the next message. |bytes|/|*num_bytes| indicate the buffer/buffer
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// size to receive the message data (if any) and |handles|/|*num_handles|
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// indicate the buffer/maximum handle count to receive the attached handles (if
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// any).
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |num_bytes| and |num_handles| are optional "in-out" parameters. If non-null,
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// on return |*num_bytes| and |*num_handles| will usually indicate the number
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// of bytes and number of attached handles in the "next" message, respectively,
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// whether that message was read or not. (If null, the number of bytes/handles
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// is treated as zero.)
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// If |bytes| is null, then |*num_bytes| must be zero, and similarly for
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |handles| and |*num_handles|.
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Partial reads are NEVER done. Either a full read is done and |MOJO_RESULT_OK|
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// returned, or the read is NOT done and |MOJO_RESULT_RESOURCE_EXHAUSTED| is
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// returned (if |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| was set, the message is
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// also discarded in this case).
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Returns:
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_OK| on success (i.e., a message was actually read).
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid.
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed.
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if one of the buffers to receive the
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       message/attached handles (|bytes|/|*num_bytes| or
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       |handles|/|*num_handles|) was too small. (TODO(vtl): Reconsider this
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       error code; should distinguish this from the hitting-system-limits
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//       case.)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   |MOJO_RESULT_SHOULD_WAIT| if no message was available to be read.
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MOJO_SYSTEM_EXPORT MojoResult
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MojoReadMessage(MojoHandle message_pipe_handle,
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    void* bytes,            // Optional out.
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    uint32_t* num_bytes,    // Optional in/out.
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    MojoHandle* handles,    // Optional out.
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    uint32_t* num_handles,  // Optional in/out.
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    MojoReadMessageFlags flags);
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef __cplusplus
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // extern "C"
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
180