| 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 | #ifndef __DISPATCH_IO__ |
| 22 | #define __DISPATCH_IO__ |
| 23 | |
| 24 | #ifndef __DISPATCH_INDIRECT__ |
| 25 | #error "Please #include <dispatch/dispatch.h> instead of this file directly." |
| 26 | #include <dispatch/base.h> // for HeaderDoc |
| 27 | #endif |
| 28 | |
| 29 | DISPATCH_ASSUME_NONNULL_BEGIN |
| 30 | DISPATCH_ASSUME_ABI_SINGLE_BEGIN |
| 31 | |
| 32 | __BEGIN_DECLS |
| 33 | |
| 34 | /*! @header |
| 35 | * Dispatch I/O provides both stream and random access asynchronous read and |
| 36 | * write operations on file descriptors. One or more dispatch I/O channels may |
| 37 | * be created from a file descriptor as either the DISPATCH_IO_STREAM type or |
| 38 | * DISPATCH_IO_RANDOM type. Once a channel has been created the application may |
| 39 | * schedule asynchronous read and write operations. |
| 40 | * |
| 41 | * The application may set policies on the dispatch I/O channel to indicate the |
| 42 | * desired frequency of I/O handlers for long-running operations. |
| 43 | * |
| 44 | * Dispatch I/O also provides a memory management model for I/O buffers that |
| 45 | * avoids unnecessary copying of data when pipelined between channels. Dispatch |
| 46 | * I/O monitors the overall memory pressure and I/O access patterns for the |
| 47 | * application to optimize resource utilization. |
| 48 | */ |
| 49 | |
| 50 | /*! |
| 51 | * @typedef dispatch_fd_t |
| 52 | * Native file descriptor type for the platform. |
| 53 | */ |
| 54 | #if defined(_WIN32) |
| 55 | typedef intptr_t dispatch_fd_t; |
| 56 | #else |
| 57 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 58 | typedef int dispatch_fd_t; |
| 59 | #endif |
| 60 | |
| 61 | /*! |
| 62 | * @functiongroup Dispatch I/O Convenience API |
| 63 | * Convenience wrappers around the dispatch I/O channel API, with simpler |
| 64 | * callback handler semantics and no explicit management of channel objects. |
| 65 | * File descriptors passed to the convenience API are treated as streams, and |
| 66 | * scheduling multiple operations on one file descriptor via the convenience API |
| 67 | * may incur more overhead than by using the dispatch I/O channel API directly. |
| 68 | */ |
| 69 | |
| 70 | #ifdef __BLOCKS__ |
| 71 | /*! |
| 72 | * @function dispatch_read |
| 73 | * Schedule a read operation for asynchronous execution on the specified file |
| 74 | * descriptor. The specified handler is enqueued with the data read from the |
| 75 | * file descriptor when the operation has completed or an error occurs. |
| 76 | * |
| 77 | * The data object passed to the handler will be automatically released by the |
| 78 | * system when the handler returns. It is the responsibility of the application |
| 79 | * to retain, concatenate or copy the data object if it is needed after the |
| 80 | * handler returns. |
| 81 | * |
| 82 | * The data object passed to the handler will only contain as much data as is |
| 83 | * currently available from the file descriptor (up to the specified length). |
| 84 | * |
| 85 | * If an unrecoverable error occurs on the file descriptor, the handler will be |
| 86 | * enqueued with the appropriate error code along with a data object of any data |
| 87 | * that could be read successfully. |
| 88 | * |
| 89 | * An invocation of the handler with an error code of zero and an empty data |
| 90 | * object indicates that EOF was reached. |
| 91 | * |
| 92 | * The system takes control of the file descriptor until the handler is |
| 93 | * enqueued, and during this time file descriptor flags such as O_NONBLOCK will |
| 94 | * be modified by the system on behalf of the application. It is an error for |
| 95 | * the application to modify a file descriptor directly while it is under the |
| 96 | * control of the system, but it may create additional dispatch I/O convenience |
| 97 | * operations or dispatch I/O channels associated with that file descriptor. |
| 98 | * |
| 99 | * @param fd		The file descriptor from which to read the data. |
| 100 | * @param length	The length of data to read from the file descriptor, |
| 101 | *			or SIZE_MAX to indicate that all of the data currently |
| 102 | *			available from the file descriptor should be read. |
| 103 | * @param queue		The dispatch queue to which the handler should be |
| 104 | *			submitted. |
| 105 | * @param handler	The handler to enqueue when data is ready to be |
| 106 | *			delivered. |
| 107 | *		param data	The data read from the file descriptor. |
| 108 | *		param error	An errno condition for the read operation or |
| 109 | *				zero if the read was successful. |
| 110 | */ |
| 111 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 112 | DISPATCH_EXPORT DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW |
| 113 | DISPATCH_REFINED_FOR_SWIFT |
| 114 | void |
| 115 | dispatch_read(dispatch_fd_t fd, |
| 116 | 	size_t length, |
| 117 | 	dispatch_queue_t queue, |
| 118 | 	void (^handler)(dispatch_data_t data, int error)); |
| 119 | |
| 120 | /*! |
| 121 | * @function dispatch_write |
| 122 | * Schedule a write operation for asynchronous execution on the specified file |
| 123 | * descriptor. The specified handler is enqueued when the operation has |
| 124 | * completed or an error occurs. |
| 125 | * |
| 126 | * If an unrecoverable error occurs on the file descriptor, the handler will be |
| 127 | * enqueued with the appropriate error code along with the data that could not |
| 128 | * be successfully written. |
| 129 | * |
| 130 | * An invocation of the handler with an error code of zero indicates that the |
| 131 | * data was fully written to the channel. |
| 132 | * |
| 133 | * The system takes control of the file descriptor until the handler is |
| 134 | * enqueued, and during this time file descriptor flags such as O_NONBLOCK will |
| 135 | * be modified by the system on behalf of the application. It is an error for |
| 136 | * the application to modify a file descriptor directly while it is under the |
| 137 | * control of the system, but it may create additional dispatch I/O convenience |
| 138 | * operations or dispatch I/O channels associated with that file descriptor. |
| 139 | * |
| 140 | * @param fd		The file descriptor to which to write the data. |
| 141 | * @param data		The data object to write to the file descriptor. |
| 142 | * @param queue		The dispatch queue to which the handler should be |
| 143 | *			submitted. |
| 144 | * @param handler	The handler to enqueue when the data has been written. |
| 145 | *		param data	The data that could not be written to the I/O |
| 146 | *				channel, or NULL. |
| 147 | *		param error	An errno condition for the write operation or |
| 148 | *				zero if the write was successful. |
| 149 | */ |
| 150 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 151 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NONNULL3 DISPATCH_NONNULL4 |
| 152 | DISPATCH_NOTHROW |
| 153 | DISPATCH_REFINED_FOR_SWIFT |
| 154 | void |
| 155 | dispatch_write(dispatch_fd_t fd, |
| 156 | 	dispatch_data_t data, |
| 157 | 	dispatch_queue_t queue, |
| 158 | 	void (^handler)(dispatch_data_t _Nullable data, int error)); |
| 159 | #endif /* __BLOCKS__ */ |
| 160 | |
| 161 | /*! |
| 162 | * @functiongroup Dispatch I/O Channel API |
| 163 | */ |
| 164 | |
| 165 | /*! |
| 166 | * @typedef dispatch_io_t |
| 167 | * A dispatch I/O channel represents the asynchronous I/O policy applied to a |
| 168 | * file descriptor. I/O channels are first class dispatch objects and may be |
| 169 | * retained and released, suspended and resumed, etc. |
| 170 | */ |
| 171 | DISPATCH_DECL_SWIFT(dispatch_io, DispatchIO); |
| 172 | |
| 173 | /*! |
| 174 | * @typedef dispatch_io_type_t |
| 175 | * The type of a dispatch I/O channel: |
| 176 | * |
| 177 | * @const DISPATCH_IO_STREAM	A dispatch I/O channel representing a stream of |
| 178 | * bytes. Read and write operations on a channel of this type are performed |
| 179 | * serially (in order of creation) and read/write data at the file pointer |
| 180 | * position that is current at the time the operation starts executing. |
| 181 | * Operations of different type (read vs. write) may be performed simultaneously. |
| 182 | * Offsets passed to operations on a channel of this type are ignored. |
| 183 | * |
| 184 | * @const DISPATCH_IO_RANDOM	A dispatch I/O channel representing a random |
| 185 | * access file. Read and write operations on a channel of this type may be |
| 186 | * performed concurrently and read/write data at the specified offset. Offsets |
| 187 | * are interpreted relative to the file pointer position current at the time the |
| 188 | * I/O channel is created. Attempting to create a channel of this type for a |
| 189 | * file descriptor that is not seekable will result in an error. |
| 190 | */ |
| 191 | #define DISPATCH_IO_STREAM 0 |
| 192 | #define DISPATCH_IO_RANDOM 1 |
| 193 | |
| 194 | DISPATCH_SWIFT_UNAVAILABLE("Use DispatchIO.StreamType") |
| 195 | typedef unsigned long dispatch_io_type_t; |
| 196 | |
| 197 | #ifdef __BLOCKS__ |
| 198 | /*! |
| 199 | * @function dispatch_io_create |
| 200 | * Create a dispatch I/O channel associated with a file descriptor. The system |
| 201 | * takes control of the file descriptor until the channel is closed, an error |
| 202 | * occurs on the file descriptor or all references to the channel are released. |
| 203 | * At that time the specified cleanup handler will be enqueued and control over |
| 204 | * the file descriptor relinquished. |
| 205 | * |
| 206 | * While a file descriptor is under the control of a dispatch I/O channel, file |
| 207 | * descriptor flags such as O_NONBLOCK will be modified by the system on behalf |
| 208 | * of the application. It is an error for the application to modify a file |
| 209 | * descriptor directly while it is under the control of a dispatch I/O channel, |
| 210 | * but it may create additional channels associated with that file descriptor. |
| 211 | * |
| 212 | * @param type	The desired type of I/O channel (DISPATCH_IO_STREAM |
| 213 | *		or DISPATCH_IO_RANDOM). |
| 214 | * @param fd	The file descriptor to associate with the I/O channel. |
| 215 | * @param queue	The dispatch queue to which the handler should be submitted. |
| 216 | * @param cleanup_handler	The handler to enqueue when the system |
| 217 | *				relinquishes control over the file descriptor. |
| 218 | *	param error		An errno condition if control is relinquished |
| 219 | *				because channel creation failed, zero otherwise. |
| 220 | * @result	The newly created dispatch I/O channel or NULL if an error |
| 221 | *		occurred (invalid type specified). |
| 222 | */ |
| 223 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 224 | DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT |
| 225 | DISPATCH_NOTHROW |
| 226 | DISPATCH_REFINED_FOR_SWIFT DISPATCH_SWIFT_NAME(DispatchIO.init(__type:fd:queue:handler:)) |
| 227 | dispatch_io_t |
| 228 | dispatch_io_create(dispatch_io_type_t type, |
| 229 | 	dispatch_fd_t fd, |
| 230 | 	dispatch_queue_t queue, |
| 231 | 	void (^cleanup_handler)(int error)); |
| 232 | |
| 233 | /*! |
| 234 | * @function dispatch_io_create_with_path |
| 235 | * Create a dispatch I/O channel associated with a path name. The specified |
| 236 | * path, oflag and mode parameters will be passed to open(2) when the first I/O |
| 237 | * operation on the channel is ready to execute and the resulting file |
| 238 | * descriptor will remain open and under the control of the system until the |
| 239 | * channel is closed, an error occurs on the file descriptor or all references |
| 240 | * to the channel are released. At that time the file descriptor will be closed |
| 241 | * and the specified cleanup handler will be enqueued. |
| 242 | * |
| 243 | * @param type	The desired type of I/O channel (DISPATCH_IO_STREAM |
| 244 | *		or DISPATCH_IO_RANDOM). |
| 245 | * @param path	The absolute path to associate with the I/O channel. |
| 246 | * @param oflag	The flags to pass to open(2) when opening the file at |
| 247 | *		path. |
| 248 | * @param mode	The mode to pass to open(2) when creating the file at |
| 249 | *		path (i.e. with flag O_CREAT), zero otherwise. |
| 250 | * @param queue	The dispatch queue to which the handler should be |
| 251 | *		submitted. |
| 252 | * @param cleanup_handler	The handler to enqueue when the system |
| 253 | *				has closed the file at path. |
| 254 | *	param error		An errno condition if control is relinquished |
| 255 | *				because channel creation or opening of the |
| 256 | *				specified file failed, zero otherwise. |
| 257 | * @result	The newly created dispatch I/O channel or NULL if an error |
| 258 | *		occurred (invalid type or non-absolute path specified). |
| 259 | */ |
| 260 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 261 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED |
| 262 | DISPATCH_WARN_RESULT DISPATCH_NOTHROW |
| 263 | DISPATCH_REFINED_FOR_SWIFT DISPATCH_SWIFT_NAME(DispatchIO.init(__type:path:oflag:mode:queue:handler:)) |
| 264 | dispatch_io_t |
| 265 | dispatch_io_create_with_path(dispatch_io_type_t type, |
| 266 | 	const char *DISPATCH_UNSAFE_INDEXABLE path, int oflag, |
| 267 | 	mode_t mode, dispatch_queue_t queue, |
| 268 | 	void (^cleanup_handler)(int error)); |
| 269 | |
| 270 | /*! |
| 271 | * @function dispatch_io_create_with_io |
| 272 | * Create a new dispatch I/O channel from an existing dispatch I/O channel. |
| 273 | * The new channel inherits the file descriptor or path name associated with |
| 274 | * the existing channel, but not its channel type or policies. |
| 275 | * |
| 276 | * If the existing channel is associated with a file descriptor, control by the |
| 277 | * system over that file descriptor is extended until the new channel is also |
| 278 | * closed, an error occurs on the file descriptor, or all references to both |
| 279 | * channels are released. At that time the specified cleanup handler will be |
| 280 | * enqueued and control over the file descriptor relinquished. |
| 281 | * |
| 282 | * While a file descriptor is under the control of a dispatch I/O channel, file |
| 283 | * descriptor flags such as O_NONBLOCK will be modified by the system on behalf |
| 284 | * of the application. It is an error for the application to modify a file |
| 285 | * descriptor directly while it is under the control of a dispatch I/O channel, |
| 286 | * but it may create additional channels associated with that file descriptor. |
| 287 | * |
| 288 | * @param type	The desired type of I/O channel (DISPATCH_IO_STREAM |
| 289 | *		or DISPATCH_IO_RANDOM). |
| 290 | * @param io	The existing channel to create the new I/O channel from. |
| 291 | * @param queue	The dispatch queue to which the handler should be submitted. |
| 292 | * @param cleanup_handler	The handler to enqueue when the system |
| 293 | *				relinquishes control over the file descriptor |
| 294 | *				(resp. closes the file at path) associated with |
| 295 | *				the existing channel. |
| 296 | *	param error		An errno condition if control is relinquished |
| 297 | *				because channel creation failed, zero otherwise. |
| 298 | * @result	The newly created dispatch I/O channel or NULL if an error |
| 299 | *		occurred (invalid type specified). |
| 300 | */ |
| 301 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 302 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED |
| 303 | DISPATCH_WARN_RESULT DISPATCH_NOTHROW |
| 304 | DISPATCH_REFINED_FOR_SWIFT DISPATCH_SWIFT_NAME(DispatchIO.init(__type:io:queue:handler:)) |
| 305 | dispatch_io_t |
| 306 | dispatch_io_create_with_io(dispatch_io_type_t type, |
| 307 | 	dispatch_io_t io, |
| 308 | 	dispatch_queue_t queue, |
| 309 | 	void (^cleanup_handler)(int error)); |
| 310 | |
| 311 | /*! |
| 312 | * @typedef dispatch_io_handler_t |
| 313 | * The prototype of I/O handler blocks for dispatch I/O operations. |
| 314 | * |
| 315 | * @param done		A flag indicating whether the operation is complete. |
| 316 | * @param data		The data object to be handled. |
| 317 | * @param error		An errno condition for the operation. |
| 318 | */ |
| 319 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 320 | typedef void (^dispatch_io_handler_t)(bool done, dispatch_data_t _Nullable data, |
| 321 | 		int error); |
| 322 | |
| 323 | /*! |
| 324 | * @function dispatch_io_read |
| 325 | * Schedule a read operation for asynchronous execution on the specified I/O |
| 326 | * channel. The I/O handler is enqueued one or more times depending on the |
| 327 | * general load of the system and the policy specified on the I/O channel. |
| 328 | * |
| 329 | * Any data read from the channel is described by the dispatch data object |
| 330 | * passed to the I/O handler. This object will be automatically released by the |
| 331 | * system when the I/O handler returns. It is the responsibility of the |
| 332 | * application to retain, concatenate or copy the data object if it is needed |
| 333 | * after the I/O handler returns. |
| 334 | * |
| 335 | * Dispatch I/O handlers are not reentrant. The system will ensure that no new |
| 336 | * I/O handler instance is invoked until the previously enqueued handler block |
| 337 | * has returned. |
| 338 | * |
| 339 | * An invocation of the I/O handler with the done flag set indicates that the |
| 340 | * read operation is complete and that the handler will not be enqueued again. |
| 341 | * |
| 342 | * If an unrecoverable error occurs on the I/O channel's underlying file |
| 343 | * descriptor, the I/O handler will be enqueued with the done flag set, the |
| 344 | * appropriate error code and a NULL data object. |
| 345 | * |
| 346 | * An invocation of the I/O handler with the done flag set, an error code of |
| 347 | * zero and an empty data object indicates that EOF was reached. |
| 348 | * |
| 349 | * @param channel	The dispatch I/O channel from which to read the data. |
| 350 | * @param offset	The offset relative to the channel position from which |
| 351 | *			to start reading (only for DISPATCH_IO_RANDOM). |
| 352 | * @param length	The length of data to read from the I/O channel, or |
| 353 | *			SIZE_MAX to indicate that data should be read until EOF |
| 354 | *			is reached. |
| 355 | * @param queue		The dispatch queue to which the I/O handler should be |
| 356 | *			submitted. |
| 357 | * @param io_handler	The I/O handler to enqueue when data is ready to be |
| 358 | *			delivered. |
| 359 | *	param done	A flag indicating whether the operation is complete. |
| 360 | *	param data	An object with the data most recently read from the |
| 361 | *			I/O channel as part of this read operation, or NULL. |
| 362 | *	param error	An errno condition for the read operation or zero if |
| 363 | *			the read was successful. |
| 364 | */ |
| 365 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 366 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL4 DISPATCH_NONNULL5 |
| 367 | DISPATCH_NOTHROW |
| 368 | DISPATCH_REFINED_FOR_SWIFT |
| 369 | void |
| 370 | dispatch_io_read(dispatch_io_t channel, |
| 371 | 	off_t offset, |
| 372 | 	size_t length, |
| 373 | 	dispatch_queue_t queue, |
| 374 | 	dispatch_io_handler_t io_handler); |
| 375 | |
| 376 | /*! |
| 377 | * @function dispatch_io_write |
| 378 | * Schedule a write operation for asynchronous execution on the specified I/O |
| 379 | * channel. The I/O handler is enqueued one or more times depending on the |
| 380 | * general load of the system and the policy specified on the I/O channel. |
| 381 | * |
| 382 | * Any data remaining to be written to the I/O channel is described by the |
| 383 | * dispatch data object passed to the I/O handler. This object will be |
| 384 | * automatically released by the system when the I/O handler returns. It is the |
| 385 | * responsibility of the application to retain, concatenate or copy the data |
| 386 | * object if it is needed after the I/O handler returns. |
| 387 | * |
| 388 | * Dispatch I/O handlers are not reentrant. The system will ensure that no new |
| 389 | * I/O handler instance is invoked until the previously enqueued handler block |
| 390 | * has returned. |
| 391 | * |
| 392 | * An invocation of the I/O handler with the done flag set indicates that the |
| 393 | * write operation is complete and that the handler will not be enqueued again. |
| 394 | * |
| 395 | * If an unrecoverable error occurs on the I/O channel's underlying file |
| 396 | * descriptor, the I/O handler will be enqueued with the done flag set, the |
| 397 | * appropriate error code and an object containing the data that could not be |
| 398 | * written. |
| 399 | * |
| 400 | * An invocation of the I/O handler with the done flag set and an error code of |
| 401 | * zero indicates that the data was fully written to the channel. |
| 402 | * |
| 403 | * @param channel	The dispatch I/O channel on which to write the data. |
| 404 | * @param offset	The offset relative to the channel position from which |
| 405 | *			to start writing (only for DISPATCH_IO_RANDOM). |
| 406 | * @param data		The data to write to the I/O channel. The data object |
| 407 | *			will be retained by the system until the write operation |
| 408 | *			is complete. |
| 409 | * @param queue		The dispatch queue to which the I/O handler should be |
| 410 | *			submitted. |
| 411 | * @param io_handler	The I/O handler to enqueue when data has been delivered. |
| 412 | *	param done	A flag indicating whether the operation is complete. |
| 413 | *	param data	An object of the data remaining to be |
| 414 | *			written to the I/O channel as part of this write |
| 415 | *			operation, or NULL. |
| 416 | *	param error	An errno condition for the write operation or zero |
| 417 | *			if the write was successful. |
| 418 | */ |
| 419 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 420 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NONNULL4 |
| 421 | DISPATCH_NONNULL5 DISPATCH_NOTHROW |
| 422 | DISPATCH_REFINED_FOR_SWIFT |
| 423 | void |
| 424 | dispatch_io_write(dispatch_io_t channel, |
| 425 | 	off_t offset, |
| 426 | 	dispatch_data_t data, |
| 427 | 	dispatch_queue_t queue, |
| 428 | 	dispatch_io_handler_t io_handler); |
| 429 | #endif /* __BLOCKS__ */ |
| 430 | |
| 431 | /*! |
| 432 | * @typedef dispatch_io_close_flags_t |
| 433 | * The type of flags you can set on a dispatch_io_close() call |
| 434 | * |
| 435 | * @const DISPATCH_IO_STOP	Stop outstanding operations on a channel when |
| 436 | *				the channel is closed. |
| 437 | */ |
| 438 | #define DISPATCH_IO_STOP 0x1 |
| 439 | |
| 440 | DISPATCH_SWIFT_UNAVAILABLE("Use DispatchIO.CloseFlags") |
| 441 | typedef unsigned long dispatch_io_close_flags_t; |
| 442 | |
| 443 | /*! |
| 444 | * @function dispatch_io_close |
| 445 | * Close the specified I/O channel to new read or write operations; scheduling |
| 446 | * operations on a closed channel results in their handler returning an error. |
| 447 | * |
| 448 | * If the DISPATCH_IO_STOP flag is provided, the system will make a best effort |
| 449 | * to interrupt any outstanding read and write operations on the I/O channel, |
| 450 | * otherwise those operations will run to completion normally. |
| 451 | * Partial results of read and write operations may be returned even after a |
| 452 | * channel is closed with the DISPATCH_IO_STOP flag. |
| 453 | * The final invocation of an I/O handler of an interrupted operation will be |
| 454 | * passed an ECANCELED error code, as will the I/O handler of an operation |
| 455 | * scheduled on a closed channel. |
| 456 | * |
| 457 | * @param channel	The dispatch I/O channel to close. |
| 458 | * @param flags		The flags for the close operation. |
| 459 | */ |
| 460 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 461 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW |
| 462 | DISPATCH_REFINED_FOR_SWIFT |
| 463 | void |
| 464 | dispatch_io_close(dispatch_io_t channel, dispatch_io_close_flags_t flags); |
| 465 | |
| 466 | #ifdef __BLOCKS__ |
| 467 | /*! |
| 468 | * @function dispatch_io_barrier |
| 469 | * Schedule a barrier operation on the specified I/O channel; all previously |
| 470 | * scheduled operations on the channel will complete before the provided |
| 471 | * barrier block is enqueued onto the global queue determined by the channel's |
| 472 | * target queue, and no subsequently scheduled operations will start until the |
| 473 | * barrier block has returned. |
| 474 | * |
| 475 | * If multiple channels are associated with the same file descriptor, a barrier |
| 476 | * operation scheduled on any of these channels will act as a barrier across all |
| 477 | * channels in question, i.e. all previously scheduled operations on any of the |
| 478 | * channels will complete before the barrier block is enqueued, and no |
| 479 | * operations subsequently scheduled on any of the channels will start until the |
| 480 | * barrier block has returned. |
| 481 | * |
| 482 | * While the barrier block is running, it may safely operate on the channel's |
| 483 | * underlying file descriptor with fsync(2), lseek(2) etc. (but not close(2)). |
| 484 | * |
| 485 | * @param channel	The dispatch I/O channel to schedule the barrier on. |
| 486 | * @param barrier	The barrier block. |
| 487 | */ |
| 488 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 489 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 490 | DISPATCH_SWIFT_NAME(DispatchIO.barrier(self:execute:)) |
| 491 | void |
| 492 | dispatch_io_barrier(dispatch_io_t channel, dispatch_block_t barrier); |
| 493 | #endif /* __BLOCKS__ */ |
| 494 | |
| 495 | /*! |
| 496 | * @function dispatch_io_get_descriptor |
| 497 | * Returns the file descriptor underlying a dispatch I/O channel. |
| 498 | * |
| 499 | * Will return -1 for a channel closed with dispatch_io_close() and for a |
| 500 | * channel associated with a path name that has not yet been open(2)ed. |
| 501 | * |
| 502 | * If called from a barrier block scheduled on a channel associated with a path |
| 503 | * name that has not yet been open(2)ed, this will trigger the channel open(2) |
| 504 | * operation and return the resulting file descriptor. |
| 505 | * |
| 506 | * @param channel	The dispatch I/O channel to query. |
| 507 | * @result		The file descriptor underlying the channel, or -1. |
| 508 | */ |
| 509 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 510 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW |
| 511 | DISPATCH_SWIFT_NAME(getter:DispatchIO.fileDescriptor(self:)) |
| 512 | dispatch_fd_t |
| 513 | dispatch_io_get_descriptor(dispatch_io_t channel); |
| 514 | |
| 515 | /*! |
| 516 | * @function dispatch_io_set_high_water |
| 517 | * Set a high water mark on the I/O channel for all operations. |
| 518 | * |
| 519 | * The system will make a best effort to enqueue I/O handlers with partial |
| 520 | * results as soon the number of bytes processed by an operation (i.e. read or |
| 521 | * written) reaches the high water mark. |
| 522 | * |
| 523 | * The size of data objects passed to I/O handlers for this channel will never |
| 524 | * exceed the specified high water mark. |
| 525 | * |
| 526 | * The default value for the high water mark is unlimited (i.e. SIZE_MAX). |
| 527 | * |
| 528 | * @param channel	The dispatch I/O channel on which to set the policy. |
| 529 | * @param high_water	The number of bytes to use as a high water mark. |
| 530 | */ |
| 531 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 532 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW |
| 533 | DISPATCH_SWIFT_NAME(DispatchIO.setLimit(self:highWater:)) |
| 534 | void |
| 535 | dispatch_io_set_high_water(dispatch_io_t channel, size_t high_water); |
| 536 | |
| 537 | /*! |
| 538 | * @function dispatch_io_set_low_water |
| 539 | * Set a low water mark on the I/O channel for all operations. |
| 540 | * |
| 541 | * The system will process (i.e. read or write) at least the low water mark |
| 542 | * number of bytes for an operation before enqueueing I/O handlers with partial |
| 543 | * results. |
| 544 | * |
| 545 | * The size of data objects passed to intermediate I/O handler invocations for |
| 546 | * this channel (i.e. excluding the final invocation) will never be smaller than |
| 547 | * the specified low water mark, except if the channel has an interval with the |
| 548 | * DISPATCH_IO_STRICT_INTERVAL flag set or if EOF or an error was encountered. |
| 549 | * |
| 550 | * I/O handlers should be prepared to receive amounts of data significantly |
| 551 | * larger than the low water mark in general. If an I/O handler requires |
| 552 | * intermediate results of fixed size, set both the low and and the high water |
| 553 | * mark to that size. |
| 554 | * |
| 555 | * The default value for the low water mark is unspecified, but must be assumed |
| 556 | * to be such that intermediate handler invocations may occur. |
| 557 | * If I/O handler invocations with partial results are not desired, set the |
| 558 | * low water mark to SIZE_MAX. |
| 559 | * |
| 560 | * @param channel	The dispatch I/O channel on which to set the policy. |
| 561 | * @param low_water	The number of bytes to use as a low water mark. |
| 562 | */ |
| 563 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 564 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW |
| 565 | DISPATCH_SWIFT_NAME(DispatchIO.setLimit(self:lowWater:)) |
| 566 | void |
| 567 | dispatch_io_set_low_water(dispatch_io_t channel, size_t low_water); |
| 568 | |
| 569 | /*! |
| 570 | * @typedef dispatch_io_interval_flags_t |
| 571 | * Type of flags to set on dispatch_io_set_interval() |
| 572 | * |
| 573 | * @const DISPATCH_IO_STRICT_INTERVAL	Enqueue I/O handlers at a channel's |
| 574 | * interval setting even if the amount of data ready to be delivered is inferior |
| 575 | * to the low water mark (or zero). |
| 576 | */ |
| 577 | #define DISPATCH_IO_STRICT_INTERVAL 0x1 |
| 578 | |
| 579 | DISPATCH_SWIFT_UNAVAILABLE("Use DispatchIO.IntervalFlags") |
| 580 | typedef unsigned long dispatch_io_interval_flags_t; |
| 581 | |
| 582 | /*! |
| 583 | * @function dispatch_io_set_interval |
| 584 | * Set a nanosecond interval at which I/O handlers are to be enqueued on the |
| 585 | * I/O channel for all operations. |
| 586 | * |
| 587 | * This allows an application to receive periodic feedback on the progress of |
| 588 | * read and write operations, e.g. for the purposes of displaying progress bars. |
| 589 | * |
| 590 | * If the amount of data ready to be delivered to an I/O handler at the interval |
| 591 | * is inferior to the channel low water mark, the handler will only be enqueued |
| 592 | * if the DISPATCH_IO_STRICT_INTERVAL flag is set. |
| 593 | * |
| 594 | * Note that the system may defer enqueueing interval I/O handlers by a small |
| 595 | * unspecified amount of leeway in order to align with other system activity for |
| 596 | * improved system performance or power consumption. |
| 597 | * |
| 598 | * @param channel	The dispatch I/O channel on which to set the policy. |
| 599 | * @param interval	The interval in nanoseconds at which delivery of the I/O |
| 600 | *					handler is desired. |
| 601 | * @param flags		Flags indicating desired data delivery behavior at |
| 602 | *					interval time. |
| 603 | */ |
| 604 | API_AVAILABLE(macos(10.7), ios(5.0)) |
| 605 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW |
| 606 | DISPATCH_REFINED_FOR_SWIFT |
| 607 | void |
| 608 | dispatch_io_set_interval(dispatch_io_t channel, |
| 609 | 	uint64_t interval, |
| 610 | 	dispatch_io_interval_flags_t flags); |
| 611 | |
| 612 | __END_DECLS |
| 613 | |
| 614 | DISPATCH_ASSUME_ABI_SINGLE_END |
| 615 | DISPATCH_ASSUME_NONNULL_END |
| 616 | |
| 617 | #endif /* __DISPATCH_IO__ */ |