zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

io.h (26859B) - Raw


      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__ */