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