]>
Commit | Line | Data |
---|---|---|
517da941 A |
1 | /* |
2 | * Copyright (c) 2009-2013 Apple Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_APACHE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
7 | * you may not use this file except in compliance with the License. | |
8 | * You may obtain a copy of the License at | |
9 | * | |
10 | * http://www.apache.org/licenses/LICENSE-2.0 | |
11 | * | |
12 | * Unless required by applicable law or agreed to in writing, software | |
13 | * distributed under the License is distributed on an "AS IS" BASIS, | |
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
15 | * See the License for the specific language governing permissions and | |
16 | * limitations under the License. | |
17 | * | |
18 | * @APPLE_APACHE_LICENSE_HEADER_END@ | |
19 | */ | |
20 | ||
21 | /* | |
22 | * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch | |
23 | * which are subject to change in future releases of Mac OS X. Any applications | |
24 | * relying on these interfaces WILL break. | |
25 | */ | |
26 | ||
27 | #ifndef __DISPATCH_IO_PRIVATE__ | |
28 | #define __DISPATCH_IO_PRIVATE__ | |
29 | ||
30 | #ifndef __DISPATCH_INDIRECT__ | |
31 | #error "Please #include <dispatch/dispatch.h> instead of this file directly." | |
32 | #include <dispatch/base.h> // for HeaderDoc | |
33 | #endif | |
34 | ||
35 | __BEGIN_DECLS | |
36 | ||
37 | /*! | |
38 | * @function dispatch_read_f | |
39 | * Schedule a read operation for asynchronous execution on the specified file | |
40 | * descriptor. The specified handler is enqueued with the data read from the | |
41 | * file descriptor when the operation has completed or an error occurs. | |
42 | * | |
43 | * The data object passed to the handler will be automatically released by the | |
44 | * system when the handler returns. It is the responsibility of the application | |
45 | * to retain, concatenate or copy the data object if it is needed after the | |
46 | * handler returns. | |
47 | * | |
48 | * The data object passed to the handler will only contain as much data as is | |
49 | * currently available from the file descriptor (up to the specified length). | |
50 | * | |
51 | * If an unrecoverable error occurs on the file descriptor, the handler will be | |
52 | * enqueued with the appropriate error code along with a data object of any data | |
53 | * that could be read successfully. | |
54 | * | |
55 | * An invocation of the handler with an error code of zero and an empty data | |
56 | * object indicates that EOF was reached. | |
57 | * | |
58 | * The system takes control of the file descriptor until the handler is | |
59 | * enqueued, and during this time file descriptor flags such as O_NONBLOCK will | |
60 | * be modified by the system on behalf of the application. It is an error for | |
61 | * the application to modify a file descriptor directly while it is under the | |
62 | * control of the system, but it may create additional dispatch I/O convenience | |
63 | * operations or dispatch I/O channels associated with that file descriptor. | |
64 | * | |
65 | * @param fd The file descriptor from which to read the data. | |
66 | * @param length The length of data to read from the file descriptor, | |
67 | * or SIZE_MAX to indicate that all of the data currently | |
68 | * available from the file descriptor should be read. | |
69 | * @param queue The dispatch queue to which the handler should be | |
70 | * submitted. | |
71 | * @param context The application-defined context parameter to pass to | |
72 | * the handler function. | |
73 | * @param handler The handler to enqueue when data is ready to be | |
74 | * delivered. | |
75 | * @param context Application-defined context parameter. | |
76 | * @param data The data read from the file descriptor. | |
77 | * @param error An errno condition for the read operation or | |
78 | * zero if the read was successful. | |
79 | */ | |
80 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
81 | DISPATCH_EXPORT DISPATCH_NONNULL3 DISPATCH_NONNULL5 DISPATCH_NOTHROW | |
82 | void | |
83 | dispatch_read_f(dispatch_fd_t fd, | |
84 | size_t length, | |
85 | dispatch_queue_t queue, | |
86 | void *context, | |
87 | void (*handler)(void *context, dispatch_data_t data, int error)); | |
88 | ||
89 | /*! | |
90 | * @function dispatch_write_f | |
91 | * Schedule a write operation for asynchronous execution on the specified file | |
92 | * descriptor. The specified handler is enqueued when the operation has | |
93 | * completed or an error occurs. | |
94 | * | |
95 | * If an unrecoverable error occurs on the file descriptor, the handler will be | |
96 | * enqueued with the appropriate error code along with the data that could not | |
97 | * be successfully written. | |
98 | * | |
99 | * An invocation of the handler with an error code of zero indicates that the | |
100 | * data was fully written to the channel. | |
101 | * | |
102 | * The system takes control of the file descriptor until the handler is | |
103 | * enqueued, and during this time file descriptor flags such as O_NONBLOCK will | |
104 | * be modified by the system on behalf of the application. It is an error for | |
105 | * the application to modify a file descriptor directly while it is under the | |
106 | * control of the system, but it may create additional dispatch I/O convenience | |
107 | * operations or dispatch I/O channels associated with that file descriptor. | |
108 | * | |
109 | * @param fd The file descriptor to which to write the data. | |
110 | * @param data The data object to write to the file descriptor. | |
111 | * @param queue The dispatch queue to which the handler should be | |
112 | * submitted. | |
113 | * @param context The application-defined context parameter to pass to | |
114 | * the handler function. | |
115 | * @param handler The handler to enqueue when the data has been written. | |
116 | * @param context Application-defined context parameter. | |
117 | * @param data The data that could not be written to the I/O | |
118 | * channel, or NULL. | |
119 | * @param error An errno condition for the write operation or | |
120 | * zero if the write was successful. | |
121 | */ | |
122 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
123 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NONNULL3 DISPATCH_NONNULL5 | |
124 | DISPATCH_NOTHROW | |
125 | void | |
126 | dispatch_write_f(dispatch_fd_t fd, | |
127 | dispatch_data_t data, | |
128 | dispatch_queue_t queue, | |
129 | void *context, | |
130 | void (*handler)(void *context, dispatch_data_t data, int error)); | |
131 | ||
132 | /*! | |
133 | * @function dispatch_io_create_f | |
134 | * Create a dispatch I/O channel associated with a file descriptor. The system | |
135 | * takes control of the file descriptor until the channel is closed, an error | |
136 | * occurs on the file descriptor or all references to the channel are released. | |
137 | * At that time the specified cleanup handler will be enqueued and control over | |
138 | * the file descriptor relinquished. | |
139 | * | |
140 | * While a file descriptor is under the control of a dispatch I/O channel, file | |
141 | * descriptor flags such as O_NONBLOCK will be modified by the system on behalf | |
142 | * of the application. It is an error for the application to modify a file | |
143 | * descriptor directly while it is under the control of a dispatch I/O channel, | |
144 | * but it may create additional channels associated with that file descriptor. | |
145 | * | |
146 | * @param type The desired type of I/O channel (DISPATCH_IO_STREAM | |
147 | * or DISPATCH_IO_RANDOM). | |
148 | * @param fd The file descriptor to associate with the I/O channel. | |
149 | * @param queue The dispatch queue to which the handler should be submitted. | |
150 | * @param context The application-defined context parameter to pass to | |
151 | * the cleanup handler function. | |
152 | * @param cleanup_handler The handler to enqueue when the system | |
153 | * relinquishes control over the file descriptor. | |
154 | * @param context Application-defined context parameter. | |
155 | * @param error An errno condition if control is relinquished | |
156 | * because channel creation failed, zero otherwise. | |
157 | * @result The newly created dispatch I/O channel or NULL if an error | |
158 | * occurred (invalid type specified). | |
159 | */ | |
160 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
161 | DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT | |
162 | DISPATCH_NOTHROW | |
163 | dispatch_io_t | |
164 | dispatch_io_create_f(dispatch_io_type_t type, | |
165 | dispatch_fd_t fd, | |
166 | dispatch_queue_t queue, | |
167 | void *context, | |
168 | void (*cleanup_handler)(void *context, int error)); | |
169 | ||
170 | /*! | |
171 | * @function dispatch_io_create_with_path_f | |
172 | * Create a dispatch I/O channel associated with a path name. The specified | |
173 | * path, oflag and mode parameters will be passed to open(2) when the first I/O | |
174 | * operation on the channel is ready to execute and the resulting file | |
175 | * descriptor will remain open and under the control of the system until the | |
176 | * channel is closed, an error occurs on the file descriptor or all references | |
177 | * to the channel are released. At that time the file descriptor will be closed | |
178 | * and the specified cleanup handler will be enqueued. | |
179 | * | |
180 | * @param type The desired type of I/O channel (DISPATCH_IO_STREAM | |
181 | * or DISPATCH_IO_RANDOM). | |
182 | * @param path The absolute path to associate with the I/O channel. | |
183 | * @param oflag The flags to pass to open(2) when opening the file at | |
184 | * path. | |
185 | * @param mode The mode to pass to open(2) when creating the file at | |
186 | * path (i.e. with flag O_CREAT), zero otherwise. | |
187 | * @param queue The dispatch queue to which the handler should be | |
188 | * submitted. | |
189 | * @param context The application-defined context parameter to pass to | |
190 | * the cleanup handler function. | |
191 | * @param cleanup_handler The handler to enqueue when the system | |
192 | * has closed the file at path. | |
193 | * @param context Application-defined context parameter. | |
194 | * @param error An errno condition if control is relinquished | |
195 | * because channel creation or opening of the | |
196 | * specified file failed, zero otherwise. | |
197 | * @result The newly created dispatch I/O channel or NULL if an error | |
198 | * occurred (invalid type or non-absolute path specified). | |
199 | */ | |
200 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
201 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED | |
202 | DISPATCH_WARN_RESULT DISPATCH_NOTHROW | |
203 | dispatch_io_t | |
204 | dispatch_io_create_with_path_f(dispatch_io_type_t type, | |
205 | const char *path, int oflag, mode_t mode, | |
206 | dispatch_queue_t queue, | |
207 | void *context, | |
208 | void (*cleanup_handler)(void *context, int error)); | |
209 | ||
210 | /*! | |
211 | * @function dispatch_io_create_with_io_f | |
212 | * Create a new dispatch I/O channel from an existing dispatch I/O channel. | |
213 | * The new channel inherits the file descriptor or path name associated with | |
214 | * the existing channel, but not its channel type or policies. | |
215 | * | |
216 | * If the existing channel is associated with a file descriptor, control by the | |
217 | * system over that file descriptor is extended until the new channel is also | |
218 | * closed, an error occurs on the file descriptor, or all references to both | |
219 | * channels are released. At that time the specified cleanup handler will be | |
220 | * enqueued and control over the file descriptor relinquished. | |
221 | * | |
222 | * While a file descriptor is under the control of a dispatch I/O channel, file | |
223 | * descriptor flags such as O_NONBLOCK will be modified by the system on behalf | |
224 | * of the application. It is an error for the application to modify a file | |
225 | * descriptor directly while it is under the control of a dispatch I/O channel, | |
226 | * but it may create additional channels associated with that file descriptor. | |
227 | * | |
228 | * @param type The desired type of I/O channel (DISPATCH_IO_STREAM | |
229 | * or DISPATCH_IO_RANDOM). | |
230 | * @param io The existing channel to create the new I/O channel from. | |
231 | * @param queue The dispatch queue to which the handler should be submitted. | |
232 | * @param context The application-defined context parameter to pass to | |
233 | * the cleanup handler function. | |
234 | * @param cleanup_handler The handler to enqueue when the system | |
235 | * relinquishes control over the file descriptor | |
236 | * (resp. closes the file at path) associated with | |
237 | * the existing channel. | |
238 | * @param context Application-defined context parameter. | |
239 | * @param error An errno condition if control is relinquished | |
240 | * because channel creation failed, zero otherwise. | |
241 | * @result The newly created dispatch I/O channel or NULL if an error | |
242 | * occurred (invalid type specified). | |
243 | */ | |
244 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
245 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED | |
246 | DISPATCH_WARN_RESULT DISPATCH_NOTHROW | |
247 | dispatch_io_t | |
248 | dispatch_io_create_with_io_f(dispatch_io_type_t type, | |
249 | dispatch_io_t io, | |
250 | dispatch_queue_t queue, | |
251 | void *context, | |
252 | void (*cleanup_handler)(void *context, int error)); | |
253 | ||
254 | /*! | |
255 | * @typedef dispatch_io_handler_function_t | |
256 | * The prototype of I/O handler functions for dispatch I/O operations. | |
257 | * | |
258 | * @param context Application-defined context parameter. | |
259 | * @param done A flag indicating whether the operation is complete. | |
260 | * @param data The data object to be handled. | |
261 | * @param error An errno condition for the operation. | |
262 | */ | |
263 | typedef void (*dispatch_io_handler_function_t)(void *context, bool done, | |
264 | dispatch_data_t data, int error); | |
265 | ||
266 | /*! | |
267 | * @function dispatch_io_read_f | |
268 | * Schedule a read operation for asynchronous execution on the specified I/O | |
269 | * channel. The I/O handler is enqueued one or more times depending on the | |
270 | * general load of the system and the policy specified on the I/O channel. | |
271 | * | |
272 | * Any data read from the channel is described by the dispatch data object | |
273 | * passed to the I/O handler. This object will be automatically released by the | |
274 | * system when the I/O handler returns. It is the responsibility of the | |
275 | * application to retain, concatenate or copy the data object if it is needed | |
276 | * after the I/O handler returns. | |
277 | * | |
278 | * Dispatch I/O handlers are not reentrant. The system will ensure that no new | |
279 | * I/O handler instance is invoked until the previously enqueued handler | |
280 | * function has returned. | |
281 | * | |
282 | * An invocation of the I/O handler with the done flag set indicates that the | |
283 | * read operation is complete and that the handler will not be enqueued again. | |
284 | * | |
285 | * If an unrecoverable error occurs on the I/O channel's underlying file | |
286 | * descriptor, the I/O handler will be enqueued with the done flag set, the | |
287 | * appropriate error code and a NULL data object. | |
288 | * | |
289 | * An invocation of the I/O handler with the done flag set, an error code of | |
290 | * zero and an empty data object indicates that EOF was reached. | |
291 | * | |
292 | * @param channel The dispatch I/O channel from which to read the data. | |
293 | * @param offset The offset relative to the channel position from which | |
294 | * to start reading (only for DISPATCH_IO_RANDOM). | |
295 | * @param length The length of data to read from the I/O channel, or | |
296 | * SIZE_MAX to indicate that data should be read until EOF | |
297 | * is reached. | |
298 | * @param queue The dispatch queue to which the I/O handler should be | |
299 | * submitted. | |
300 | * @param context The application-defined context parameter to pass to | |
301 | * the handler function. | |
302 | * @param io_handler The I/O handler to enqueue when data is ready to be | |
303 | * delivered. | |
304 | * @param context Application-defined context parameter. | |
305 | * @param done A flag indicating whether the operation is complete. | |
306 | * @param data An object with the data most recently read from the | |
307 | * I/O channel as part of this read operation, or NULL. | |
308 | * @param error An errno condition for the read operation or zero if | |
309 | * the read was successful. | |
310 | */ | |
311 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
312 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL4 DISPATCH_NONNULL6 | |
313 | DISPATCH_NOTHROW | |
314 | void | |
315 | dispatch_io_read_f(dispatch_io_t channel, | |
316 | off_t offset, | |
317 | size_t length, | |
318 | dispatch_queue_t queue, | |
319 | void *context, | |
320 | dispatch_io_handler_function_t io_handler); | |
321 | ||
322 | /*! | |
323 | * @function dispatch_io_write_f | |
324 | * Schedule a write operation for asynchronous execution on the specified I/O | |
325 | * channel. The I/O handler is enqueued one or more times depending on the | |
326 | * general load of the system and the policy specified on the I/O channel. | |
327 | * | |
328 | * Any data remaining to be written to the I/O channel is described by the | |
329 | * dispatch data object passed to the I/O handler. This object will be | |
330 | * automatically released by the system when the I/O handler returns. It is the | |
331 | * responsibility of the application to retain, concatenate or copy the data | |
332 | * object if it is needed after the I/O handler returns. | |
333 | * | |
334 | * Dispatch I/O handlers are not reentrant. The system will ensure that no new | |
335 | * I/O handler instance is invoked until the previously enqueued handler | |
336 | * function has returned. | |
337 | * | |
338 | * An invocation of the I/O handler with the done flag set indicates that the | |
339 | * write operation is complete and that the handler will not be enqueued again. | |
340 | * | |
341 | * If an unrecoverable error occurs on the I/O channel's underlying file | |
342 | * descriptor, the I/O handler will be enqueued with the done flag set, the | |
343 | * appropriate error code and an object containing the data that could not be | |
344 | * written. | |
345 | * | |
346 | * An invocation of the I/O handler with the done flag set and an error code of | |
347 | * zero indicates that the data was fully written to the channel. | |
348 | * | |
349 | * @param channel The dispatch I/O channel on which to write the data. | |
350 | * @param offset The offset relative to the channel position from which | |
351 | * to start writing (only for DISPATCH_IO_RANDOM). | |
352 | * @param data The data to write to the I/O channel. The data object | |
353 | * will be retained by the system until the write operation | |
354 | * is complete. | |
355 | * @param queue The dispatch queue to which the I/O handler should be | |
356 | * submitted. | |
357 | * @param context The application-defined context parameter to pass to | |
358 | * the handler function. | |
359 | * @param io_handler The I/O handler to enqueue when data has been delivered. | |
360 | * @param context Application-defined context parameter. | |
361 | * @param done A flag indicating whether the operation is complete. | |
362 | * @param data An object of the data remaining to be | |
363 | * written to the I/O channel as part of this write | |
364 | * operation, or NULL. | |
365 | * @param error An errno condition for the write operation or zero | |
366 | * if the write was successful. | |
367 | */ | |
368 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
369 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NONNULL4 | |
370 | DISPATCH_NONNULL6 DISPATCH_NOTHROW | |
371 | void | |
372 | dispatch_io_write_f(dispatch_io_t channel, | |
373 | off_t offset, | |
374 | dispatch_data_t data, | |
375 | dispatch_queue_t queue, | |
376 | void *context, | |
377 | dispatch_io_handler_function_t io_handler); | |
378 | ||
379 | /*! | |
380 | * @function dispatch_io_barrier_f | |
381 | * Schedule a barrier operation on the specified I/O channel; all previously | |
382 | * scheduled operations on the channel will complete before the provided | |
383 | * barrier function is enqueued onto the global queue determined by the | |
384 | * channel's target queue, and no subsequently scheduled operations will start | |
385 | * until the barrier function has returned. | |
386 | * | |
387 | * If multiple channels are associated with the same file descriptor, a barrier | |
388 | * operation scheduled on any of these channels will act as a barrier across all | |
389 | * channels in question, i.e. all previously scheduled operations on any of the | |
390 | * channels will complete before the barrier function is enqueued, and no | |
391 | * operations subsequently scheduled on any of the channels will start until the | |
392 | * barrier function has returned. | |
393 | * | |
394 | * While the barrier function is running, it may safely operate on the channel's | |
395 | * underlying file descriptor with fsync(2), lseek(2) etc. (but not close(2)). | |
396 | * | |
397 | * @param channel The dispatch I/O channel to schedule the barrier on. | |
398 | * @param context The application-defined context parameter to pass to | |
399 | * the barrier function. | |
400 | * @param barrier The barrier function. | |
401 | */ | |
402 | __OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0) | |
403 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW | |
404 | void | |
405 | dispatch_io_barrier_f(dispatch_io_t channel, | |
406 | void *context, | |
407 | dispatch_function_t barrier); | |
408 | ||
409 | __END_DECLS | |
410 | ||
411 | #endif /* __DISPATCH_IO_PRIVATE__ */ |