| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // This file contains types/constants and functions specific to buffers (and in | |
| 6 // particular shared buffers). | |
| 7 // TODO(vtl): Reorganize this file (etc.) to separate general buffer functions | |
| 8 // from (shared) buffer creation. | |
| 9 // | |
| 10 // Note: This header should be compilable as C. | |
| 11 | |
| 12 #ifndef MOJO_PUBLIC_C_SYSTEM_BUFFER_H_ | |
| 13 #define MOJO_PUBLIC_C_SYSTEM_BUFFER_H_ | |
| 14 | |
| 15 #include "mojo/public/c/system/macros.h" | |
| 16 #include "mojo/public/c/system/system_export.h" | |
| 17 #include "mojo/public/c/system/types.h" | |
| 18 | |
| 19 // |MojoCreateSharedBufferOptions|: Used to specify creation parameters for a | |
| 20 // shared buffer to |MojoCreateSharedBuffer()|. | |
| 21 // |uint32_t struct_size|: Set to the size of the | |
| 22 // |MojoCreateSharedBufferOptions| struct. (Used to allow for future | |
| 23 // extensions.) | |
| 24 // |MojoCreateSharedBufferOptionsFlags flags|: Reserved for future use. | |
| 25 // |MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE|: No flags; default mode. | |
| 26 // | |
| 27 // TODO(vtl): Maybe add a flag to indicate whether the memory should be | |
| 28 // executable or not? | |
| 29 // TODO(vtl): Also a flag for discardable (ashmem-style) buffers. | |
| 30 | |
| 31 typedef uint32_t MojoCreateSharedBufferOptionsFlags; | |
| 32 | |
| 33 #ifdef __cplusplus | |
| 34 const MojoCreateSharedBufferOptionsFlags | |
| 35 MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE = 0; | |
| 36 #else | |
| 37 #define MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE \ | |
| 38 ((MojoCreateSharedBufferOptionsFlags)0) | |
| 39 #endif | |
| 40 | |
| 41 MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment"); | |
| 42 struct MOJO_ALIGNAS(8) MojoCreateSharedBufferOptions { | |
| 43 uint32_t struct_size; | |
| 44 MojoCreateSharedBufferOptionsFlags flags; | |
| 45 }; | |
| 46 MOJO_STATIC_ASSERT(sizeof(MojoCreateSharedBufferOptions) == 8, | |
| 47 "MojoCreateSharedBufferOptions has wrong size"); | |
| 48 | |
| 49 // |MojoDuplicateBufferHandleOptions|: Used to specify parameters in duplicating | |
| 50 // access to a shared buffer to |MojoDuplicateBufferHandle()|. | |
| 51 // |uint32_t struct_size|: Set to the size of the | |
| 52 // |MojoDuplicateBufferHandleOptions| struct. (Used to allow for future | |
| 53 // extensions.) | |
| 54 // |MojoDuplicateBufferHandleOptionsFlags flags|: Reserved for future use. | |
| 55 // |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE|: No flags; default | |
| 56 // mode. | |
| 57 // | |
| 58 // TODO(vtl): Add flags to remove writability (and executability)? Also, COW? | |
| 59 | |
| 60 typedef uint32_t MojoDuplicateBufferHandleOptionsFlags; | |
| 61 | |
| 62 #ifdef __cplusplus | |
| 63 const MojoDuplicateBufferHandleOptionsFlags | |
| 64 MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE = 0; | |
| 65 #else | |
| 66 #define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE \ | |
| 67 ((MojoDuplicateBufferHandleOptionsFlags)0) | |
| 68 #endif | |
| 69 | |
| 70 struct MojoDuplicateBufferHandleOptions { | |
| 71 uint32_t struct_size; | |
| 72 MojoDuplicateBufferHandleOptionsFlags flags; | |
| 73 }; | |
| 74 MOJO_STATIC_ASSERT(sizeof(MojoDuplicateBufferHandleOptions) == 8, | |
| 75 "MojoDuplicateBufferHandleOptions has wrong size"); | |
| 76 | |
| 77 // |MojoMapBufferFlags|: Used to specify different modes to |MojoMapBuffer()|. | |
| 78 // |MOJO_MAP_BUFFER_FLAG_NONE| - No flags; default mode. | |
| 79 | |
| 80 typedef uint32_t MojoMapBufferFlags; | |
| 81 | |
| 82 #ifdef __cplusplus | |
| 83 const MojoMapBufferFlags MOJO_MAP_BUFFER_FLAG_NONE = 0; | |
| 84 #else | |
| 85 #define MOJO_MAP_BUFFER_FLAG_NONE ((MojoMapBufferFlags)0) | |
| 86 #endif | |
| 87 | |
| 88 #ifdef __cplusplus | |
| 89 extern "C" { | |
| 90 #endif | |
| 91 | |
| 92 // Note: See the comment in functions.h about the meaning of the "optional" | |
| 93 // label for pointer parameters. | |
| 94 | |
| 95 // Creates a buffer of size |num_bytes| bytes that can be shared between | |
| 96 // applications (by duplicating the handle -- see |MojoDuplicateBufferHandle()| | |
| 97 // -- and passing it over a message pipe). To access the buffer, one must call | |
| 98 // |MojoMapBuffer()|. | |
| 99 // | |
| 100 // |options| may be set to null for a shared buffer with the default options. | |
| 101 // | |
| 102 // On success, |*shared_buffer_handle| will be set to the handle for the shared | |
| 103 // buffer. (On failure, it is not modified.) | |
| 104 // | |
| 105 // Note: While more than |num_bytes| bytes may apparently be | |
| 106 // available/visible/readable/writable, trying to use those extra bytes is | |
| 107 // undefined behavior. | |
| 108 // | |
| 109 // Returns: | |
| 110 // |MOJO_RESULT_OK| on success. | |
| 111 // |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g., | |
| 112 // |*options| is invalid). | |
| 113 // |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has | |
| 114 // been reached (e.g., if the requested size was too large, or if the | |
| 115 // maximum number of handles was exceeded). | |
| 116 // |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|. | |
| 117 MOJO_SYSTEM_EXPORT MojoResult MojoCreateSharedBuffer( | |
| 118 const struct MojoCreateSharedBufferOptions* options, // Optional. | |
| 119 uint64_t num_bytes, // In. | |
| 120 MojoHandle* shared_buffer_handle); // Out. | |
| 121 | |
| 122 // Duplicates the handle |buffer_handle| to a buffer. This creates another | |
| 123 // handle (returned in |*new_buffer_handle| on success), which can then be sent | |
| 124 // to another application over a message pipe, while retaining access to the | |
| 125 // |buffer_handle| (and any mappings that it may have). | |
| 126 // | |
| 127 // |options| may be set to null to duplicate the buffer handle with the default | |
| 128 // options. | |
| 129 // | |
| 130 // On success, |*shared_buffer_handle| will be set to the handle for the new | |
| 131 // buffer handle. (On failure, it is not modified.) | |
| 132 // | |
| 133 // Returns: | |
| 134 // |MOJO_RESULT_OK| on success. | |
| 135 // |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g., | |
| 136 // |buffer_handle| is not a valid buffer handle or |*options| is invalid). | |
| 137 // |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|. | |
| 138 MOJO_SYSTEM_EXPORT MojoResult MojoDuplicateBufferHandle( | |
| 139 MojoHandle buffer_handle, | |
| 140 const struct MojoDuplicateBufferHandleOptions* options, // Optional. | |
| 141 MojoHandle* new_buffer_handle); // Out. | |
| 142 | |
| 143 // Maps the part (at offset |offset| of length |num_bytes|) of the buffer given | |
| 144 // by |buffer_handle| into memory, with options specified by |flags|. |offset + | |
| 145 // num_bytes| must be less than or equal to the size of the buffer. On success, | |
| 146 // |*buffer| points to memory with the requested part of the buffer. (On | |
| 147 // failure, it is not modified.) | |
| 148 // | |
| 149 // A single buffer handle may have multiple active mappings (possibly depending | |
| 150 // on the buffer type). The permissions (e.g., writable or executable) of the | |
| 151 // returned memory may depend on the properties of the buffer and properties | |
| 152 // attached to the buffer handle as well as |flags|. | |
| 153 // | |
| 154 // Note: Though data outside the specified range may apparently be | |
| 155 // available/visible/readable/writable, trying to use those extra bytes is | |
| 156 // undefined behavior. | |
| 157 // | |
| 158 // Returns: | |
| 159 // |MOJO_RESULT_OK| on success. | |
| 160 // |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g., | |
| 161 // |buffer_handle| is not a valid buffer handle or the range specified by | |
| 162 // |offset| and |num_bytes| is not valid). | |
| 163 // |MOJO_RESULT_RESOURCE_EXHAUSTED| if the mapping operation itself failed | |
| 164 // (e.g., due to not having appropriate address space available). | |
| 165 MOJO_SYSTEM_EXPORT MojoResult MojoMapBuffer(MojoHandle buffer_handle, | |
| 166 uint64_t offset, | |
| 167 uint64_t num_bytes, | |
| 168 void** buffer, // Out. | |
| 169 MojoMapBufferFlags flags); | |
| 170 | |
| 171 // Unmaps a buffer pointer that was mapped by |MojoMapBuffer()|. |buffer| must | |
| 172 // have been the result of |MojoMapBuffer()| (not some pointer strictly inside | |
| 173 // the mapped memory), and the entire mapping will be removed (partial unmapping | |
| 174 // is not supported). A mapping may only be unmapped exactly once. | |
| 175 // | |
| 176 // Returns: | |
| 177 // |MOJO_RESULT_OK| on success. | |
| 178 // |MOJO_RESULT_INVALID_ARGUMENT| if |buffer| is invalid (e.g., is not the | |
| 179 // result of |MojoMapBuffer()| or has already been unmapped). | |
| 180 MOJO_SYSTEM_EXPORT MojoResult MojoUnmapBuffer(void* buffer); // In. | |
| 181 | |
| 182 #ifdef __cplusplus | |
| 183 } // extern "C" | |
| 184 #endif | |
| 185 | |
| 186 #endif // MOJO_PUBLIC_C_SYSTEM_BUFFER_H_ | |
| OLD | NEW |