• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 data pipes.
6 //
7 // Note: This header should be compilable as C.
8 
9 #ifndef MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
10 #define MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
11 
12 #include <stdint.h>
13 
14 #include "mojo/public/c/system/macros.h"
15 #include "mojo/public/c/system/system_export.h"
16 #include "mojo/public/c/system/types.h"
17 
18 // |MojoCreateDataPipeOptions|: Used to specify creation parameters for a data
19 // pipe to |MojoCreateDataPipe()|.
20 //   |uint32_t struct_size|: Set to the size of the |MojoCreateDataPipeOptions|
21 //       struct. (Used to allow for future extensions.)
22 //   |MojoCreateDataPipeOptionsFlags flags|: Used to specify different modes of
23 //       operation.
24 //     |MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
25 //   |uint32_t element_num_bytes|: The size of an element, in bytes. All
26 //       transactions and buffers will consist of an integral number of
27 //       elements. Must be nonzero.
28 //   |uint32_t capacity_num_bytes|: The capacity of the data pipe, in number of
29 //       bytes; must be a multiple of |element_num_bytes|. The data pipe will
30 //       always be able to queue AT LEAST this much data. Set to zero to opt for
31 //       a system-dependent automatically-calculated capacity (which will always
32 //       be at least one element).
33 
34 typedef uint32_t MojoCreateDataPipeOptionsFlags;
35 
36 #ifdef __cplusplus
37 const MojoCreateDataPipeOptionsFlags MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE =
38     0;
39 #else
40 #define MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE \
41   ((MojoCreateDataPipeOptionsFlags)0)
42 #endif
43 
44 MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
45 struct MOJO_ALIGNAS(8) MojoCreateDataPipeOptions {
46   MOJO_ALIGNAS(4) uint32_t struct_size;
47   MOJO_ALIGNAS(4) MojoCreateDataPipeOptionsFlags flags;
48   MOJO_ALIGNAS(4) uint32_t element_num_bytes;
49   MOJO_ALIGNAS(4) uint32_t capacity_num_bytes;
50 };
51 MOJO_STATIC_ASSERT(sizeof(MojoCreateDataPipeOptions) == 16,
52                    "MojoCreateDataPipeOptions has wrong size");
53 
54 // |MojoWriteDataFlags|: Used to specify different modes to |MojoWriteData()|
55 // and |MojoBeginWriteData()|.
56 //   |MOJO_WRITE_DATA_FLAG_NONE| - No flags; default mode.
57 //   |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| - Write either all the elements
58 //       requested or none of them.
59 
60 typedef uint32_t MojoWriteDataFlags;
61 
62 #ifdef __cplusplus
63 const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_NONE = 0;
64 const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_ALL_OR_NONE = 1 << 0;
65 #else
66 #define MOJO_WRITE_DATA_FLAG_NONE ((MojoWriteDataFlags)0)
67 #define MOJO_WRITE_DATA_FLAG_ALL_OR_NONE ((MojoWriteDataFlags)1 << 0)
68 #endif
69 
70 // |MojoReadDataFlags|: Used to specify different modes to |MojoReadData()| and
71 // |MojoBeginReadData()|.
72 //   |MOJO_READ_DATA_FLAG_NONE| - No flags; default mode.
73 //   |MOJO_READ_DATA_FLAG_ALL_OR_NONE| - Read (or discard) either the requested
74 //        number of elements or none.
75 //   |MOJO_READ_DATA_FLAG_DISCARD| - Discard (up to) the requested number of
76 //        elements.
77 //   |MOJO_READ_DATA_FLAG_QUERY| - Query the number of elements available to
78 //       read. For use with |MojoReadData()| only. Mutually exclusive with
79 //       |MOJO_READ_DATA_FLAG_DISCARD|, and |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
80 //       is ignored if this flag is set.
81 //   |MOJO_READ_DATA_FLAG_PEEK| - Read elements without removing them. For use
82 //       with |MojoReadData()| only. Mutually exclusive with
83 //       |MOJO_READ_DATA_FLAG_DISCARD| and |MOJO_READ_DATA_FLAG_QUERY|.
84 
85 typedef uint32_t MojoReadDataFlags;
86 
87 #ifdef __cplusplus
88 const MojoReadDataFlags MOJO_READ_DATA_FLAG_NONE = 0;
89 const MojoReadDataFlags MOJO_READ_DATA_FLAG_ALL_OR_NONE = 1 << 0;
90 const MojoReadDataFlags MOJO_READ_DATA_FLAG_DISCARD = 1 << 1;
91 const MojoReadDataFlags MOJO_READ_DATA_FLAG_QUERY = 1 << 2;
92 const MojoReadDataFlags MOJO_READ_DATA_FLAG_PEEK = 1 << 3;
93 #else
94 #define MOJO_READ_DATA_FLAG_NONE ((MojoReadDataFlags)0)
95 #define MOJO_READ_DATA_FLAG_ALL_OR_NONE ((MojoReadDataFlags)1 << 0)
96 #define MOJO_READ_DATA_FLAG_DISCARD ((MojoReadDataFlags)1 << 1)
97 #define MOJO_READ_DATA_FLAG_QUERY ((MojoReadDataFlags)1 << 2)
98 #define MOJO_READ_DATA_FLAG_PEEK ((MojoReadDataFlags)1 << 3)
99 #endif
100 
101 #ifdef __cplusplus
102 extern "C" {
103 #endif
104 
105 // Note: See the comment in functions.h about the meaning of the "optional"
106 // label for pointer parameters.
107 
108 // Creates a data pipe, which is a unidirectional communication channel for
109 // unframed data, with the given options. Data is unframed, but must come as
110 // (multiples of) discrete elements, of the size given in |options|. See
111 // |MojoCreateDataPipeOptions| for a description of the different options
112 // available for data pipes.
113 //
114 // |options| may be set to null for a data pipe with the default options (which
115 // will have an element size of one byte and have some system-dependent
116 // capacity).
117 //
118 // On success, |*data_pipe_producer_handle| will be set to the handle for the
119 // producer and |*data_pipe_consumer_handle| will be set to the handle for the
120 // consumer. (On failure, they are not modified.)
121 //
122 // Returns:
123 //   |MOJO_RESULT_OK| on success.
124 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
125 //       |*options| is invalid).
126 //   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
127 //       been reached (e.g., if the requested capacity was too large, or if the
128 //       maximum number of handles was exceeded).
129 //   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
130 MOJO_SYSTEM_EXPORT MojoResult MojoCreateDataPipe(
131     const struct MojoCreateDataPipeOptions* options,  // Optional.
132     MojoHandle* data_pipe_producer_handle,            // Out.
133     MojoHandle* data_pipe_consumer_handle);           // Out.
134 
135 // Writes the given data to the data pipe producer given by
136 // |data_pipe_producer_handle|. |elements| points to data of size |*num_bytes|;
137 // |*num_bytes| should be a multiple of the data pipe's element size. If
138 // |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| is set in |flags|, either all the data
139 // will be written or none is.
140 //
141 // On success, |*num_bytes| is set to the amount of data that was actually
142 // written.
143 //
144 // Note: If the data pipe has the "may discard" option flag (specified on
145 // creation), this will discard as much data as required to write the given
146 // data, starting with the earliest written data that has not been consumed.
147 // However, even with "may discard", if |*num_bytes| is greater than the data
148 // pipe's capacity (and |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| is not set), this
149 // will write the maximum amount possible (namely, the data pipe's capacity) and
150 // set |*num_bytes| to that amount. It will *not* discard data from |elements|.
151 //
152 // Returns:
153 //   |MOJO_RESULT_OK| on success.
154 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
155 //       |data_pipe_producer_dispatcher| is not a handle to a data pipe
156 //       producer or |*num_bytes| is not a multiple of the data pipe's element
157 //       size).
158 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
159 //       closed.
160 //   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has
161 //       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set and the required amount of data
162 //       (specified by |*num_bytes|) could not be written.
163 //   |MOJO_RESULT_BUSY| if there is a two-phase write ongoing with
164 //       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
165 //       called, but not yet the matching |MojoEndWriteData()|).
166 //   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
167 //       consumer is still open) and |flags| does *not* have
168 //       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
169 //
170 // TODO(vtl): Should there be a way of querying how much data can be written?
171 MOJO_SYSTEM_EXPORT MojoResult
172     MojoWriteData(MojoHandle data_pipe_producer_handle,
173                   const void* elements,
174                   uint32_t* num_bytes,  // In/out.
175                   MojoWriteDataFlags flags);
176 
177 // Begins a two-phase write to the data pipe producer given by
178 // |data_pipe_producer_handle|. On success, |*buffer| will be a pointer to which
179 // the caller can write |*buffer_num_bytes| bytes of data. If flags has
180 // |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set, then the output value
181 // |*buffer_num_bytes| will be at least as large as its input value, which must
182 // also be a multiple of the element size (if |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE|
183 // is not set, the input value of |*buffer_num_bytes| is ignored).
184 //
185 // During a two-phase write, |data_pipe_producer_handle| is *not* writable.
186 // E.g., if another thread tries to write to it, it will get |MOJO_RESULT_BUSY|;
187 // that thread can then wait for |data_pipe_producer_handle| to become writable
188 // again.
189 //
190 // When |MojoBeginWriteData()| returns MOJO_RESULT_OK, and the caller has
191 // finished writing data to |*buffer|, it should call |MojoEndWriteData()| to
192 // specify the amount written and to complete the two-phase write.
193 // |MojoEndWriteData()| need not be called for other return values.
194 //
195 // Note: If the data pipe has the "may discard" option flag (specified on
196 // creation) and |flags| has |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set, this may
197 // discard some data.
198 //
199 // Returns:
200 //   |MOJO_RESULT_OK| on success.
201 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
202 //       |data_pipe_producer_handle| is not a handle to a data pipe producer or
203 //       flags has |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set and
204 //       |*buffer_num_bytes| is not a multiple of the element size).
205 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
206 //       closed.
207 //   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has
208 //       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set and the required amount of data
209 //       (specified by |*buffer_num_bytes|) cannot be written contiguously at
210 //       this time. (Note that there may be space available for the required
211 //       amount of data, but the "next" write position may not be large enough.)
212 //   |MOJO_RESULT_BUSY| if there is already a two-phase write ongoing with
213 //       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
214 //       called, but not yet the matching |MojoEndWriteData()|).
215 //   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
216 //       consumer is still open).
217 MOJO_SYSTEM_EXPORT MojoResult
218     MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
219                        void** buffer,               // Out.
220                        uint32_t* buffer_num_bytes,  // In/out.
221                        MojoWriteDataFlags flags);
222 
223 // Ends a two-phase write to the data pipe producer given by
224 // |data_pipe_producer_handle| that was begun by a call to
225 // |MojoBeginWriteData()| on the same handle. |num_bytes_written| should
226 // indicate the amount of data actually written; it must be less than or equal
227 // to the value of |*buffer_num_bytes| output by |MojoBeginWriteData()| and must
228 // be a multiple of the element size. The buffer given by |*buffer| from
229 // |MojoBeginWriteData()| must have been filled with exactly |num_bytes_written|
230 // bytes of data.
231 //
232 // On failure, the two-phase write (if any) is ended (so the handle may become
233 // writable again, if there's space available) but no data written to |*buffer|
234 // is "put into" the data pipe.
235 //
236 // Returns:
237 //   |MOJO_RESULT_OK| on success.
238 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
239 //       |data_pipe_producer_handle| is not a handle to a data pipe producer or
240 //       |num_bytes_written| is invalid (greater than the maximum value provided
241 //       by |MojoBeginWriteData()| or not a multiple of the element size).
242 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer is not in a
243 //       two-phase write (e.g., |MojoBeginWriteData()| was not called or
244 //       |MojoEndWriteData()| has already been called).
245 MOJO_SYSTEM_EXPORT MojoResult
246     MojoEndWriteData(MojoHandle data_pipe_producer_handle,
247                      uint32_t num_bytes_written);
248 
249 // Reads data from the data pipe consumer given by |data_pipe_consumer_handle|.
250 // May also be used to discard data or query the amount of data available.
251 //
252 // If |flags| has neither |MOJO_READ_DATA_FLAG_DISCARD| nor
253 // |MOJO_READ_DATA_FLAG_QUERY| set, this tries to read up to |*num_bytes| (which
254 // must be a multiple of the data pipe's element size) bytes of data to
255 // |elements| and set |*num_bytes| to the amount actually read. If flags has
256 // |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set, it will either read exactly
257 // |*num_bytes| bytes of data or none. Additionally, if flags has
258 // |MOJO_READ_DATA_FLAG_PEEK| set, the data read will remain in the pipe and be
259 // available to future reads.
260 //
261 // If flags has |MOJO_READ_DATA_FLAG_DISCARD| set, it discards up to
262 // |*num_bytes| (which again must be a multiple of the element size) bytes of
263 // data, setting |*num_bytes| to the amount actually discarded. If flags has
264 // |MOJO_READ_DATA_FLAG_ALL_OR_NONE|, it will either discard exactly
265 // |*num_bytes| bytes of data or none. In this case, |MOJO_READ_DATA_FLAG_QUERY|
266 // must not be set, and |elements| is ignored (and should typically be set to
267 // null).
268 //
269 // If flags has |MOJO_READ_DATA_FLAG_QUERY| set, it queries the amount of data
270 // available, setting |*num_bytes| to the number of bytes available. In this
271 // case, |MOJO_READ_DATA_FLAG_DISCARD| must not be set, and
272 // |MOJO_READ_DATA_FLAG_ALL_OR_NONE| is ignored, as are |elements| and the input
273 // value of |*num_bytes|.
274 //
275 // Returns:
276 //   |MOJO_RESULT_OK| on success (see above for a description of the different
277 //       operations).
278 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
279 //       |data_pipe_consumer_handle| is invalid, the combination of flags in
280 //       |flags| is invalid, etc.).
281 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
282 //       closed and data (or the required amount of data) was not available to
283 //       be read or discarded.
284 //   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
285 //       set and the required amount of data is not available to be read or
286 //       discarded (and the producer is still open).
287 //   |MOJO_RESULT_BUSY| if there is a two-phase read ongoing with
288 //       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
289 //       called, but not yet the matching |MojoEndReadData()|).
290 //   |MOJO_RESULT_SHOULD_WAIT| if there is no data to be read or discarded (and
291 //       the producer is still open) and |flags| does *not* have
292 //       |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
293 MOJO_SYSTEM_EXPORT MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
294                                            void* elements,       // Out.
295                                            uint32_t* num_bytes,  // In/out.
296                                            MojoReadDataFlags flags);
297 
298 // Begins a two-phase read from the data pipe consumer given by
299 // |data_pipe_consumer_handle|. On success, |*buffer| will be a pointer from
300 // which the caller can read |*buffer_num_bytes| bytes of data. If flags has
301 // |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set, then the output value
302 // |*buffer_num_bytes| will be at least as large as its input value, which must
303 // also be a multiple of the element size (if |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
304 // is not set, the input value of |*buffer_num_bytes| is ignored). |flags| must
305 // not have |MOJO_READ_DATA_FLAG_DISCARD|, |MOJO_READ_DATA_FLAG_QUERY|, or
306 // |MOJO_READ_DATA_FLAG_PEEK| set.
307 //
308 // During a two-phase read, |data_pipe_consumer_handle| is *not* readable.
309 // E.g., if another thread tries to read from it, it will get
310 // |MOJO_RESULT_BUSY|; that thread can then wait for |data_pipe_consumer_handle|
311 // to become readable again.
312 //
313 // Once the caller has finished reading data from |*buffer|, it should call
314 // |MojoEndReadData()| to specify the amount read and to complete the two-phase
315 // read.
316 //
317 // Returns:
318 //   |MOJO_RESULT_OK| on success.
319 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
320 //       |data_pipe_consumer_handle| is not a handle to a data pipe consumer,
321 //       |flags| has |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set and
322 //       |*buffer_num_bytes| is not a multiple of the element size, or |flags|
323 //       has invalid flags set).
324 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
325 //       closed.
326 //   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
327 //       set and the required amount of data (specified by |*buffer_num_bytes|)
328 //       cannot be read from a contiguous buffer at this time. (Note that there
329 //       may be the required amount of data, but it may not be contiguous.)
330 //   |MOJO_RESULT_BUSY| if there is already a two-phase read ongoing with
331 //       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
332 //       called, but not yet the matching |MojoEndReadData()|).
333 //   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be read (and the
334 //       producer is still open).
335 MOJO_SYSTEM_EXPORT MojoResult
336     MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
337                       const void** buffer,         // Out.
338                       uint32_t* buffer_num_bytes,  // In/out.
339                       MojoReadDataFlags flags);
340 
341 // Ends a two-phase read from the data pipe consumer given by
342 // |data_pipe_consumer_handle| that was begun by a call to |MojoBeginReadData()|
343 // on the same handle. |num_bytes_read| should indicate the amount of data
344 // actually read; it must be less than or equal to the value of
345 // |*buffer_num_bytes| output by |MojoBeginReadData()| and must be a multiple of
346 // the element size.
347 //
348 // On failure, the two-phase read (if any) is ended (so the handle may become
349 // readable again) but no data is "removed" from the data pipe.
350 //
351 // Returns:
352 //   |MOJO_RESULT_OK| on success.
353 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
354 //       |data_pipe_consumer_handle| is not a handle to a data pipe consumer or
355 //       |num_bytes_written| is greater than the maximum value provided by
356 //       |MojoBeginReadData()| or not a multiple of the element size).
357 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer is not in a
358 //       two-phase read (e.g., |MojoBeginReadData()| was not called or
359 //       |MojoEndReadData()| has already been called).
360 MOJO_SYSTEM_EXPORT MojoResult
361     MojoEndReadData(MojoHandle data_pipe_consumer_handle,
362                     uint32_t num_bytes_read);
363 
364 #ifdef __cplusplus
365 }  // extern "C"
366 #endif
367 
368 #endif  // MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
369