| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 |
- /*
- * Copyright (c) 2008-2013 Apple Inc. All rights reserved.
- *
- * @APPLE_APACHE_LICENSE_HEADER_START@
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @APPLE_APACHE_LICENSE_HEADER_END@
- */
- /*
- * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
- * which are subject to change in future releases of Mac OS X. Any applications
- * relying on these interfaces WILL break.
- */
- #ifndef __DISPATCH_QUEUE_PRIVATE__
- #define __DISPATCH_QUEUE_PRIVATE__
- #ifndef __DISPATCH_INDIRECT__
- #error "Please #include <dispatch/private.h> instead of this file directly."
- #include <dispatch/base.h> // for HeaderDoc
- #endif
- DISPATCH_ASSUME_NONNULL_BEGIN
- __BEGIN_DECLS
- /*!
- * @enum dispatch_queue_flags_t
- *
- * @constant DISPATCH_QUEUE_OVERCOMMIT
- * The queue will create a new thread for invoking blocks, regardless of how
- * busy the computer is.
- */
- enum {
- DISPATCH_QUEUE_OVERCOMMIT = 0x2ull,
- };
- /*!
- * @function dispatch_set_qos_class
- *
- * @abstract
- * Sets the QOS class on a dispatch queue, source or mach channel.
- *
- * @discussion
- * This is equivalent to using dispatch_queue_make_attr_with_qos_class()
- * when creating a dispatch queue, but is availabile on additional dispatch
- * object types.
- *
- * When configured in this manner, the specified QOS class will be used over
- * the assigned QOS of workitems submitted asynchronously to this object,
- * unless the workitem has been created with ENFORCE semantics
- * (see DISPATCH_BLOCK_ENFORCE_QOS_CLASS).
- *
- * Calling this function will supersede any prior calls to
- * dispatch_set_qos_class() or dispatch_set_qos_class_floor().
- *
- * @param object
- * A dispatch queue, source or mach channel to configure.
- * The object must be inactive, and can't be a workloop.
- *
- * Passing another object type or an object that has been activated is undefined
- * and will cause the process to be terminated.
- *
- * @param qos_class
- * A QOS class value:
- * - QOS_CLASS_USER_INTERACTIVE
- * - QOS_CLASS_USER_INITIATED
- * - QOS_CLASS_DEFAULT
- * - QOS_CLASS_UTILITY
- * - QOS_CLASS_BACKGROUND
- * Passing any other value is undefined.
- *
- * @param relative_priority
- * A relative priority within the QOS class. This value is a negative
- * offset from the maximum supported scheduler priority for the given class.
- * Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY
- * is undefined.
- */
- API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
- DISPATCH_EXPORT DISPATCH_NOTHROW
- void
- dispatch_set_qos_class(dispatch_object_t object,
- dispatch_qos_class_t qos_class, int relative_priority);
- /*!
- * @function dispatch_set_qos_class_floor
- *
- * @abstract
- * Sets the QOS class floor on a dispatch queue, source, workloop or mach
- * channel.
- *
- * @discussion
- * The QOS class of workitems submitted to this object asynchronously will be
- * elevated to at least the specified QOS class floor.
- * Unlike dispatch_set_qos_class(), the QOS of the workitem will be used if
- * higher than the floor even when the workitem has been created without
- * "ENFORCE" semantics.
- *
- * Setting the QOS class floor is equivalent to the QOS effects of configuring
- * a target queue whose QOS class has been set with dispatch_set_qos_class().
- *
- * Calling this function will supersede any prior calls to
- * dispatch_set_qos_class() or dispatch_set_qos_class_floor().
- *
- * @param object
- * A dispatch queue, workloop, source or mach channel to configure.
- * The object must be inactive.
- *
- * Passing another object type or an object that has been activated is undefined
- * and will cause the process to be terminated.
- *
- * @param qos_class
- * A QOS class value:
- * - QOS_CLASS_USER_INTERACTIVE
- * - QOS_CLASS_USER_INITIATED
- * - QOS_CLASS_DEFAULT
- * - QOS_CLASS_UTILITY
- * - QOS_CLASS_BACKGROUND
- * Passing any other value is undefined.
- *
- * @param relative_priority
- * A relative priority within the QOS class. This value is a negative
- * offset from the maximum supported scheduler priority for the given class.
- * Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY
- * is undefined.
- */
- API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
- DISPATCH_EXPORT DISPATCH_NOTHROW
- void
- dispatch_set_qos_class_floor(dispatch_object_t object,
- dispatch_qos_class_t qos_class, int relative_priority);
- /*!
- * @function dispatch_set_qos_class_fallback
- *
- * @abstract
- * Sets the fallback QOS class on a dispatch queue, source, workloop or mach
- * channel.
- *
- * @discussion
- * Workitems submitted asynchronously to this object that don't have an assigned
- * QOS class will use the specified QOS class as a fallback. This interface
- * doesn't support relative priority.
- *
- * Workitems without an assigned QOS are:
- * - workitems submitted from the context of a thread opted-out of QOS,
- * - workitems created with the DISPATCH_BLOCK_DETACHED or
- * DISPATCH_BLOCK_NO_QOS_CLASS flags,
- * - XPC messages sent with xpc_connection_send_notification(),
- * - XPC connection and dispatch source handlers.
- *
- * Calling both dispatch_set_qos_class_fallback() and dispatch_set_qos_class()
- * on an object will only apply the effect of dispatch_set_qos_class().
- *
- * A QOS class fallback must always be at least as high as the current QOS
- * floor for the dispatch queue hierarchy, else it is ignored.
- *
- * When no QOS fallback has been explicitly specified:
- * - queues on hierarchies without a QOS class or QOS class floor have
- * a fallback of QOS_CLASS_DEFAULT,
- * - queues on hierarchies with a QOS class or QOS class floor configured will
- * also use that QOS class as a fallback.
- *
- * @param object
- * A dispatch queue, workloop, source or mach channel to configure.
- * The object must be inactive.
- *
- * Passing another object type or an object that has been activated is undefined
- * and will cause the process to be terminated.
- *
- * @param qos_class
- * A QOS class value:
- * - QOS_CLASS_USER_INTERACTIVE
- * - QOS_CLASS_USER_INITIATED
- * - QOS_CLASS_DEFAULT
- * - QOS_CLASS_UTILITY
- * - QOS_CLASS_BACKGROUND
- * Passing any other value is undefined.
- */
- API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
- DISPATCH_EXPORT DISPATCH_NOTHROW
- void
- dispatch_set_qos_class_fallback(dispatch_object_t object,
- dispatch_qos_class_t qos_class);
- #define DISPATCH_QUEUE_FLAGS_MASK (DISPATCH_QUEUE_OVERCOMMIT)
- // On FreeBSD pthread_attr_t is a typedef to a pointer type
- #if defined(__FreeBSD__)
- # define DISPATCH_QUEUE_NULLABLE_PTHREAD_ATTR_PTR _Nullable
- #else
- # define DISPATCH_QUEUE_NULLABLE_PTHREAD_ATTR_PTR
- #endif
- /*!
- * @function dispatch_queue_attr_make_with_overcommit
- *
- * @discussion
- * Returns a dispatch queue attribute value with the overcommit flag set to the
- * specified value.
- *
- * This attribute only makes sense when the specified queue is targeted at
- * a root queue. Passing this attribute to dispatch_queue_create_with_target()
- * with a target queue that is not a root queue will result in an assertion and
- * the process being terminated.
- *
- * It is recommended to not specify a target queue at all when using this
- * attribute and to use dispatch_queue_attr_make_with_qos_class() to select the
- * appropriate QOS class instead.
- *
- * Queues created with this attribute cannot change target after having been
- * activated. See dispatch_set_target_queue() and dispatch_activate().
- *
- * @param attr
- * A queue attribute value to be combined with the overcommit flag, or NULL.
- *
- * @param overcommit
- * Boolean overcommit flag.
- *
- * @return
- * Returns an attribute value which may be provided to dispatch_queue_create().
- * This new value combines the attributes specified by the 'attr' parameter and
- * the overcommit flag.
- */
- API_AVAILABLE(macos(10.10), ios(8.0))
- DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW
- dispatch_queue_attr_t
- dispatch_queue_attr_make_with_overcommit(dispatch_queue_attr_t _Nullable attr,
- bool overcommit);
- /*!
- * @typedef dispatch_queue_priority_t
- *
- * @constant DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE
- * Items dispatched to the queue will run at non-interactive priority.
- * This priority level is intended for user-initiated application activity that
- * is long-running and CPU or IO intensive and that the user is actively waiting
- * on, but that should not interfere with interactive use of the application.
- *
- * This global queue priority level is mapped to QOS_CLASS_UTILITY.
- */
- #define DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE INT8_MIN
- /*!
- * @function dispatch_queue_set_label_nocopy
- *
- * @abstract
- * Set the label for a given queue, without copying the input string.
- *
- * @discussion
- * The queue must have been initially created with a NULL label, else using
- * this function to set the queue label is undefined.
- *
- * The caller of this function must make sure the label pointer remains valid
- * while it is used as the queue label and while any callers to
- * dispatch_queue_get_label() may have obtained it. Since the queue lifetime
- * may extend past the last release, it is advised to call this function with
- * a constant string or NULL before the queue is released, or to destroy the
- * label from a finalizer for that queue.
- *
- * This function should be called before any work item could call
- * dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) or from the context of
- * the queue itself.
- *
- * @param queue
- * The queue to adjust. Attempts to set the label of the main queue or a global
- * concurrent queue will be ignored.
- *
- * @param label
- * The new label for the queue.
- */
- API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
- DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW
- void
- dispatch_queue_set_label_nocopy(dispatch_queue_t queue,
- const char * _Nullable label);
- /*!
- * @function dispatch_queue_set_width
- *
- * @abstract
- * Set the width of concurrency for a given queue. The width of a serial queue
- * is one.
- *
- * @discussion
- * This SPI is DEPRECATED and will be removed in a future release.
- * Uses of this SPI to make a queue concurrent by setting its width to LONG_MAX
- * should be replaced by passing DISPATCH_QUEUE_CONCURRENT to
- * dispatch_queue_create().
- * Uses of this SPI to limit queue concurrency are not recommended and should
- * be replaced by alternative mechanisms such as a dispatch semaphore created
- * with the desired concurrency width.
- *
- * @param queue
- * The queue to adjust. Attempts to set the width of the main queue or a global
- * concurrent queue will be ignored.
- *
- * @param width
- * The new maximum width of concurrency depending on available resources.
- * If zero is passed, then the value is promoted to one.
- * Negative values are magic values that map to automatic width values.
- * Unknown negative values default to DISPATCH_QUEUE_WIDTH_MAX_LOGICAL_CPUS.
- */
- #define DISPATCH_QUEUE_WIDTH_ACTIVE_CPUS -1
- #define DISPATCH_QUEUE_WIDTH_MAX_PHYSICAL_CPUS -2
- #define DISPATCH_QUEUE_WIDTH_MAX_LOGICAL_CPUS -3
- API_DEPRECATED("Use dispatch_queue_create(name, DISPATCH_QUEUE_CONCURRENT)",
- macos(10.6,10.10), ios(4.0,8.0))
- DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
- void
- dispatch_queue_set_width(dispatch_queue_t dq, long width);
- #if defined(__BLOCKS__) && defined(__APPLE__)
- /*!
- * @function dispatch_pthread_root_queue_create
- *
- * @abstract
- * Creates a new concurrent dispatch root queue with a pthread-based pool of
- * worker threads owned by the application.
- *
- * @discussion
- * Dispatch pthread root queues are similar to the global concurrent dispatch
- * queues in that they invoke blocks concurrently, however the blocks are not
- * executed on ordinary worker threads but use a dedicated pool of pthreads not
- * shared with the global queues or any other pthread root queues.
- *
- * NOTE: this is a special-purpose facility that should only be used in very
- * limited circumstances, in almost all cases the global concurrent queues
- * should be preferred. While this facility allows for more flexibility in
- * configuring worker threads for special needs it comes at the cost of
- * increased overall memory usage due to reduced thread sharing and higher
- * latency in worker thread bringup.
- *
- * Dispatch pthread root queues do not support suspension, application context
- * and change of width or of target queue. They can however be used as the
- * target queue for serial or concurrent queues obtained via
- * dispatch_queue_create() or dispatch_queue_create_with_target(), which
- * enables the blocks submitted to those queues to be processed on the root
- * queue's pthread pool.
- *
- * When a dispatch pthread root queue is no longer needed, it should be
- * released with dispatch_release(). Existing worker pthreads and pending blocks
- * submitted to the root queue will hold a reference to the queue so it will not
- * be deallocated until all blocks have finished and worker threads exited.
- *
- * @param label
- * A string label to attach to the queue.
- * This parameter is optional and may be NULL.
- *
- * @param flags
- * Pass flags value returned by dispatch_pthread_root_queue_flags_pool_size()
- * or 0 if unused.
- *
- * @param attr
- * Attributes passed to pthread_create(3) when creating worker pthreads. This
- * parameter is copied and can be destroyed after this call returns.
- * This parameter is optional and may be NULL.
- *
- * @param configure
- * Configuration block called on newly created worker pthreads before any blocks
- * for the root queue are executed. The block may configure the current thread
- * as needed.
- * This parameter is optional and may be NULL.
- *
- * @result
- * The newly created dispatch pthread root queue.
- */
- API_AVAILABLE(macos(10.9), ios(6.0)) DISPATCH_LINUX_UNAVAILABLE()
- DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT
- DISPATCH_NOTHROW
- dispatch_queue_global_t
- dispatch_pthread_root_queue_create(const char *_Nullable label,
- unsigned long flags, const pthread_attr_t DISPATCH_QUEUE_NULLABLE_PTHREAD_ATTR_PTR *_Nullable attr,
- dispatch_block_t _Nullable configure);
- /*!
- * @function dispatch_pthread_root_queue_flags_pool_size
- *
- * @abstract
- * Returns flags argument to pass to dispatch_pthread_root_queue_create() to
- * specify the maximum size of the pthread pool to use for a pthread root queue.
- *
- * @param pool_size
- * Maximum size of the pthread pool to use for the root queue. The number of
- * pthreads created for this root queue will never exceed this number but there
- * is no guarantee that the specified number will be reached.
- * Pass 0 to specify that a default pool size determined by the system should
- * be used.
- * NOTE: passing pool_size == 1 does NOT make the pthread root queue equivalent
- * to a serial queue.
- *
- * @result
- * The flags argument to pass to dispatch_pthread_root_queue_create().
- */
- DISPATCH_INLINE DISPATCH_ALWAYS_INLINE
- unsigned long
- dispatch_pthread_root_queue_flags_pool_size(uint8_t pool_size)
- {
- #define _DISPATCH_PTHREAD_ROOT_QUEUE_FLAG_POOL_SIZE (0x80000000ul)
- return (_DISPATCH_PTHREAD_ROOT_QUEUE_FLAG_POOL_SIZE |
- (unsigned long)pool_size);
- }
- /*!
- * @function dispatch_pthread_root_queue_copy_current
- *
- * @abstract
- * Returns a reference to the pthread root queue object that has created the
- * currently executing thread, or NULL if the current thread is not associated
- * to a pthread root queue.
- *
- * @result
- * A new reference to a pthread root queue object or NULL.
- */
- API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
- DISPATCH_LINUX_UNAVAILABLE()
- DISPATCH_EXPORT DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT DISPATCH_NOTHROW
- dispatch_queue_global_t _Nullable
- dispatch_pthread_root_queue_copy_current(void);
- /*!
- * @constant DISPATCH_APPLY_CURRENT_ROOT_QUEUE
- *
- * @discussion
- * This constant is deprecated, please use DISPATCH_APPLY_AUTO.
- *
- * DISPATCH_APPLY_AUTO also selects the current pthread root queue if
- * applicable.
- */
- #define DISPATCH_APPLY_CURRENT_ROOT_QUEUE ((dispatch_queue_t _Nonnull)0)
- #endif /* defined(__BLOCKS__) && defined(__APPLE__) */
- /*!
- * @function dispatch_async_enforce_qos_class_f
- *
- * @abstract
- * Submits a function for asynchronous execution on a dispatch queue.
- *
- * @discussion
- * See dispatch_async() for details. The QOS will be enforced as if
- * this was called:
- * <code>
- * dispatch_async(queue, dispatch_block_create(DISPATCH_BLOCK_ENFORCE_QOS_CLASS, ^{
- * work(context);
- * });
- * </code>
- *
- * @param queue
- * The target dispatch queue to which the function is submitted.
- * The system will hold a reference on the target queue until the function
- * has returned.
- * The result of passing NULL in this parameter is undefined.
- *
- * @param context
- * The application-defined context parameter to pass to the function.
- *
- * @param work
- * The application-defined function to invoke on the target queue. The first
- * parameter passed to this function is the context provided to
- * dispatch_async_f().
- * The result of passing NULL in this parameter is undefined.
- */
- API_AVAILABLE(macos(10.11), ios(9.0))
- DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW
- void
- dispatch_async_enforce_qos_class_f(dispatch_queue_t queue,
- void *_Nullable context, dispatch_function_t work);
- #ifdef __ANDROID__
- /*!
- * @function _dispatch_install_thread_detach_callback
- *
- * @param cb
- * Function to be called before each worker thread exits to detach JVM.
- *
- * Hook to be able to detach threads from the Java JVM before they exit.
- * If JNI has been used on a thread on Android it needs to have been
- * "detached" before the thread exits or the application will crash.
- */
- DISPATCH_EXPORT
- void _dispatch_install_thread_detach_callback(void (*cb)(void));
- #endif
- __END_DECLS
- DISPATCH_ASSUME_NONNULL_END
- #endif
|