Index: mojo/public/c/system/platform_handle.h |
diff --git a/mojo/public/c/system/platform_handle.h b/mojo/public/c/system/platform_handle.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0b02357d46a53ce49d32ef2aa4cad24871aa523c |
--- /dev/null |
+++ b/mojo/public/c/system/platform_handle.h |
@@ -0,0 +1,184 @@ |
+// Copyright 2016 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. |
+ |
+// This file contains types/functions and constants for platform handle wrapping |
+// and unwrapping APIs. |
+// |
+// Note: This header should be compilable as C. |
+ |
+#ifndef MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_ |
+#define MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_ |
+ |
+#include <stdint.h> |
+ |
+#include "mojo/public/c/system/system_export.h" |
+#include "mojo/public/c/system/types.h" |
+ |
+#ifdef __cplusplus |
+extern "C" { |
+#endif |
+ |
+// |MojoPlatformHandleType|: A value indicating the specific type of platform |
+// handle encapsulated by a MojoPlatformHandle (see below.) This is stored |
+// in the MojoPlatformHandle's |type| field and determines how the |value| |
+// field is interpreted. |
+// |
+// |MOJO_PLATFORM_HANDLE_TYPE_INVALID| - An invalid platform handle. |
+// |MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR| - A file descriptor. Only valid |
+// on POSIX systems. |
+// |MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT| - A Mach port. Only valid on OS X. |
+// |MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE| - A Windows HANDLE value. Only |
+// valid on Windows. |
+ |
+typedef uint32_t MojoPlatformHandleType; |
+ |
+#ifdef __cplusplus |
+const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_INVALID = 0; |
+const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR = 1; |
+const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT = 2; |
+const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE = 3; |
+#else |
+#define MOJO_PLATFORM_HANDLE_TYPE_INVALID ((MojoPlatformHandleType)0) |
+#define MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR ((MojoPlatformHandleType)1) |
+#define MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT ((MojoPlatformHandleType)2) |
+#define MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE ((MojoPlatformHandleType)3) |
+#endif |
+ |
+// |MojoPlatformHandle|: A handle to an OS object. |
+// |uint32_t struct_size|: The size of this structure. Used for versioning |
+// to allow for future extensions. |
+// |MojoPlatformHandleType type|: The type of handle stored in |value|. |
+// |uint64_t value|: The value of this handle. Ignored if |type| is |
+// MOJO_PLATFORM_HANDLE_TYPE_INVALID. |
+// |
+ |
+struct MOJO_ALIGNAS(8) MojoPlatformHandle { |
+ uint32_t struct_size; |
+ MojoPlatformHandleType type; |
+ uint64_t value; |
+}; |
+MOJO_STATIC_ASSERT(sizeof(MojoPlatformHandle) == 16, |
+ "MojoPlatformHandle has wrong size"); |
+ |
+// |MojoPlatformSharedBufferHandleFlags|: Flags relevant to wrapped platform |
+// shared buffers. |
+// |
+// |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_NONE| - No flags. |
+// |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_READ_ONLY| - Indicates that the wrapped |
+// buffer handle may only be mapped for reading. |
+ |
+typedef uint32_t MojoPlatformSharedBufferHandleFlags; |
+ |
+#ifdef __cplusplus |
+const MojoPlatformSharedBufferHandleFlags |
+MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE = 0; |
+ |
+const MojoPlatformSharedBufferHandleFlags |
+MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY = 1 << 0; |
+#else |
+#define MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE \ |
+ ((MojoPlatformSharedBufferHandleFlags)0) |
+ |
+#define MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY \ |
+ ((MojoPlatformSharedBufferHandleFlags)1 << 0) |
+#endif |
+ |
+// Wraps a generic platform handle as a Mojo handle which can be transferred |
+// over a message pipe. Takes ownership of the underlying platform object. |
+// |
+// |platform_handle|: The platform handle to wrap. |
+// |
+// Returns: |
+// |MOJO_RESULT_OK| if the handle was successfully wrapped. In this case |
+// |*mojo_handle| contains the Mojo handle of the wrapped object. |
+// |MOJO_RESULT_RESOURCE_EXHAUSTED| if the system is out of handles. |
+// |MOJO_RESULT_INVALID_ARGUMENT| if |platform_handle| was not a valid |
+// platform handle. |
+// |
+// NOTE: It is not always possible to detect if |platform_handle| is valid, |
+// particularly when |platform_handle->type| is valid but |
+// |platform_handle->value| does not represent a valid platform object. |
+MOJO_SYSTEM_EXPORT MojoResult |
+MojoWrapPlatformHandle(const struct MojoPlatformHandle* platform_handle, |
+ MojoHandle* mojo_handle); // Out |
+ |
+// Unwraps a generic platform handle from a Mojo handle. If this call succeeds, |
+// ownership of the underlying platform object is bound to the returned platform |
+// handle and becomes the caller's responsibility. The Mojo handle is always |
+// closed regardless of success or failure. |
+// |
+// |mojo_handle|: The Mojo handle from which to unwrap the platform handle. |
+// |
+// Returns: |
+// |MOJO_RESULT_OK| if the handle was successfully unwrapped. In this case |
+// |*platform_handle| contains the unwrapped platform handle. |
+// |MOJO_RESULT_INVALID_ARGUMENT| if |mojo_handle| was not a valid Mojo |
+// handle wrapping a platform handle. |
+MOJO_SYSTEM_EXPORT MojoResult |
+MojoUnwrapPlatformHandle(MojoHandle mojo_handle, |
+ struct MojoPlatformHandle* platform_handle); // Out |
+ |
+// Wraps a platform shared buffer handle as a Mojo shared buffer handle which |
+// can be transferred over a message pipe. Takes ownership of the platform |
+// shared buffer handle. |
+// |
+// |platform_handle|: The platform handle to wrap. Must be a handle to a |
+// shared buffer object. |
+// |num_bytes|: The size of the shared buffer in bytes. |
+// |flags|: Flags which influence the treatment of the shared buffer object. See |
+// below. |
+// |
+// Flags: |
+// |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE| indicates default behavior. |
+// No flags set. |
+// |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY| indicates that the |
+// buffer handled to be wrapped may only be mapped as read-only. This |
+// flag does NOT change the access control of the buffer in any way. |
+// |
+// Returns: |
+// |MOJO_RESULT_OK| if the handle was successfully wrapped. In this case |
+// |*mojo_handle| contains a Mojo shared buffer handle. |
+// |MOJO_RESULT_INVALID_ARGUMENT| if |platform_handle| was not a valid |
+// platform shared buffer handle. |
+MOJO_SYSTEM_EXPORT MojoResult |
+MojoWrapPlatformSharedBufferHandle( |
+ const struct MojoPlatformHandle* platform_handle, |
+ size_t num_bytes, |
+ MojoPlatformSharedBufferHandleFlags flags, |
+ MojoHandle* mojo_handle); // Out |
+ |
+// Unwraps a platform shared buffer handle from a Mojo shared buffer handle. |
+// If this call succeeds, ownership of the underlying shared buffer object is |
+// bound to the returned platform handle and becomes the caller's |
+// responsibility. The Mojo handle is always closed regardless of success or |
+// failure. |
+// |
+// |mojo_handle|: The Mojo shared buffer handle to unwrap. |
+// |
+// |platform_handle|, |num_bytes| and |flags| are used to receive output values |
+// and MUST always be non-null. |
+// |
+// Returns: |
+// |MOJO_RESULT_OK| if the handle was successfully unwrapped. In this case |
+// |*platform_handle| contains a platform shared buffer handle, |
+// |*num_bytes| contains the size of the shared buffer object, and |
+// |*flags| indicates flags relevant to the wrapped buffer (see below). |
+// |MOJO_RESULT_INVALID_ARGUMENT| if |mojo_handle| is not a valid Mojo |
+// shared buffer handle. |
+// |
+// Flags which may be set in |*flags| upon success: |
+// |MOJO_PLATFORM_SHARED_BUFFER_FLAG_READ_ONLY| is set iff the unwrapped |
+// shared buffer handle may only be mapped as read-only. |
+MOJO_SYSTEM_EXPORT MojoResult |
+MojoUnwrapPlatformSharedBufferHandle( |
+ MojoHandle mojo_handle, |
+ struct MojoPlatformHandle* platform_handle, |
+ size_t* num_bytes, |
+ MojoPlatformSharedBufferHandleFlags* flags); |
+ |
+#ifdef __cplusplus |
+} // extern "C" |
+#endif |
+ |
+#endif // MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_ |