in private/source_private.h [408:599]
DISPATCH_MEMORYPRESSURE_PROC_LIMIT_WARN DISPATCH_ENUM_API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 0x10,
DISPATCH_MEMORYPRESSURE_PROC_LIMIT_CRITICAL DISPATCH_ENUM_API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 0x20,
DISPATCH_MEMORYPRESSURE_MSL_STATUS DISPATCH_ENUM_API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0)) = 0xf0000000,
};
/*!
* Macros to check the exit status obtained from the status field of the
* structure returned by the dispatch_source_get_extended_data() function for a
* source of type DISPATCH_SOURCE_TYPE_PROC when DISPATCH_PROC_EXIT_STATUS has
* been requested.
*
* DISPATCH_PROC_EXIT_STATUS_EXITED returns whether the process exited. If this
* is true, the exit status can be obtained from DISPATCH_PROC_EXIT_STATUS_CODE.
*
* DISPATCH_PROC_EXIT_STATUS_SIGNALED returns whether the process was terminated
* by a signal.
*
* DISPATCH_PROC_EXIT_STATUS_TERMSIG returns the signal that caused the process
* to terminate, or 0 if the process was not terminated by a signal.
*
* DISPATCH_PROC_EXIT_STATUS_CORE_DUMPED returns whether a core dump of the
* process was created.
*/
#define DISPATCH_PROC_EXIT_STATUS_EXITED(status) ((bool)WIFEXITED(status))
#define DISPATCH_PROC_EXIT_STATUS_CODE(status) ((int)WEXITSTATUS(status))
#define DISPATCH_PROC_EXIT_STATUS_SIGNALED(status) ((bool)WIFSIGNALED(status))
#define DISPATCH_PROC_EXIT_STATUS_TERMSIG(status) ((int)WTERMSIG(status))
#define DISPATCH_PROC_EXIT_STATUS_CORE_DUMPED(status) ((bool)WCOREDUMP(status))
__BEGIN_DECLS
/*!
* @function dispatch_source_set_mandatory_cancel_handler
*
* @abstract
* Sets the event handler block for the given dispatch source, and indicates
* that calling dispatch_source_cancel() is mandatory for this source object.
*
* @discussion
* The cancellation handler (if specified) will be submitted to the source's
* target queue in response to a call to dispatch_source_cancel() once the
* system has released all references to the source's underlying handle and
* the source's event handler block has returned.
*
* When this function has been used used to set a cancellation handler, then
* the following result in an assertion and the process being terminated:
* - releasing the last reference on the dispatch source without having
* cancelled it by calling dispatch_source_cancel();
* - changing any handler after the source has been activated;
* - changing the target queue of the source after it has been activated.
*
* IMPORTANT:
* Source cancellation and a cancellation handler are required for file
* descriptor and mach port based sources in order to safely close the
* descriptor or destroy the port. Making the cancellation handler of such
* sources mandatory is strongly recommended.
* Closing the descriptor or port before the cancellation handler is invoked may
* result in a race condition. If a new descriptor is allocated with the same
* value as the recently closed descriptor while the source's event handler is
* still running, the event handler may read/write data to the wrong descriptor.
*
* @param source
* The dispatch source to modify.
* The result of passing NULL in this parameter is undefined.
*
* @param handler
* The cancellation handler block to submit to the source's target queue.
* The result of passing NULL in this parameter is undefined.
*/
#ifdef __BLOCKS__
API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
void
dispatch_source_set_mandatory_cancel_handler(dispatch_source_t source,
dispatch_block_t handler);
#endif /* __BLOCKS__ */
/*!
* @function dispatch_source_set_mandatory_cancel_handler_f
*
* @abstract
* Sets the event handler function for the given dispatch source, and causes an
* assertion if this source is released before having been explicitly canceled.
*
* @discussion
* See dispatch_source_set_mandatory_cancel_handler() for more details.
*
* @param source
* The dispatch source to modify.
* The result of passing NULL in this parameter is undefined.
*
* @param handler
* The cancellation handler function to submit to the source's target queue.
* The context parameter passed to the event handler function is the current
* context of the dispatch source at the time the handler call is made.
* The result of passing NULL in this parameter is undefined.
*/
API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
void
dispatch_source_set_mandatory_cancel_handler_f(dispatch_source_t source,
dispatch_function_t handler);
/*!
* @function dispatch_source_cancel_and_wait
*
* @abstract
* Synchronously cancel the dispatch source, preventing any further invocation
* of its event handler block.
*
* @discussion
* Cancellation prevents any further invocation of handler blocks for the
* specified dispatch source, but does not interrupt a handler block that is
* already in progress.
*
* When this function returns, any handler block that may have been in progress
* has returned, the specified source has been unregistered and it is safe to
* reclaim any system resource (such as file descriptors or mach ports) that
* the specified source was monitoring.
*
* If the specified dispatch source is inactive, it will be activated as a side
* effect of calling this function.
*
* It is possible to call this function from several threads concurrently,
* and it is the responsibility of the callers to synchronize reclaiming the
* associated system resources.
*
* This function is not subject to priority inversion when it is waiting on
* a handler block still in progress, unlike patterns based on waiting on
* a dispatch semaphore or a dispatch group signaled (or left) from the source
* cancel handler.
*
* This function must not be called if the specified source has a cancel
* handler set, or from the context of its handler blocks.
*
* This function must not be called from the context of the target queue of
* the specified source or from any queue that synchronizes with it. Note that
* calling dispatch_source_cancel() from such a context already guarantees
* that no handler is in progress, and that no new event will be delivered.
*
* This function must not be called on sources suspended with an explicit
* call to dispatch_suspend(), or being concurrently activated on another
* thread.
*
* @param source
* The dispatch source to be canceled.
* The result of passing NULL in this parameter is undefined.
*/
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
DISPATCH_EXPORT DISPATCH_NOTHROW
void
dispatch_source_cancel_and_wait(dispatch_source_t source);
#if __has_include(<mach/mach.h>)
/*!
* @typedef dispatch_mig_callback_t
*
* @abstract
* The signature of a function that handles Mach message delivery and response.
*/
typedef boolean_t (*dispatch_mig_callback_t)(mach_msg_header_t *message,
mach_msg_header_t *reply);
API_AVAILABLE(macos(10.6), ios(4.0)) DISPATCH_LINUX_UNAVAILABLE()
DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
mach_msg_return_t
dispatch_mig_server(dispatch_source_t ds, size_t maxmsgsz,
dispatch_mig_callback_t callback);
/*!
* @function dispatch_mach_msg_get_context
*
* @abstract
* Extract the context pointer from a mach message trailer.
*/
API_AVAILABLE(macos(10.6), ios(4.0)) DISPATCH_LINUX_UNAVAILABLE()
DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NONNULL_ALL
DISPATCH_NOTHROW
void *_Nullable
dispatch_mach_msg_get_context(mach_msg_header_t *msg);
#endif
/*!
* @typedef dispatch_source_extended_data_t
*
* @abstract
* Type used by dispatch_source_get_extended_data() to return a consistent
* snapshot of the data and status of a dispatch source.
*/
typedef struct dispatch_source_extended_data_s {