2 * Copyright (c) 2008-2013 Apple Inc. All rights reserved.
4 * @APPLE_APACHE_LICENSE_HEADER_START@
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * @APPLE_APACHE_LICENSE_HEADER_END@
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.
27 #ifndef __DISPATCH_QUEUE_PRIVATE__
28 #define __DISPATCH_QUEUE_PRIVATE__
30 #ifndef __DISPATCH_INDIRECT__
31 #error "Please #include <dispatch/private.h> instead of this file directly."
32 #include <dispatch/base.h> // for HeaderDoc
35 DISPATCH_ASSUME_NONNULL_BEGIN
40 * @enum dispatch_queue_flags_t
42 * @constant DISPATCH_QUEUE_OVERCOMMIT
43 * The queue will create a new thread for invoking blocks, regardless of how
44 * busy the computer is.
47 DISPATCH_QUEUE_OVERCOMMIT
= 0x2ull
,
50 #define DISPATCH_QUEUE_FLAGS_MASK (DISPATCH_QUEUE_OVERCOMMIT)
53 * @function dispatch_queue_attr_make_with_overcommit
56 * Returns a dispatch queue attribute value with the overcommit flag set to the
59 * This attribute only makes sense when the specified queue is targeted at
60 * a root queue. Passing this attribute to dispatch_queue_create_with_target()
61 * with a target queue that is not a root queue will result in an assertion and
62 * the process being terminated.
64 * It is recommended to not specify a target queue at all when using this
65 * attribute and to use dispatch_queue_attr_make_with_qos_class() to select the
66 * appropriate QoS class instead.
68 * Queues created with this attribute cannot change target after having been
69 * activated. See dispatch_set_target_queue() and dispatch_activate().
72 * A queue attribute value to be combined with the overcommit flag, or NULL.
75 * Boolean overcommit flag.
78 * Returns an attribute value which may be provided to dispatch_queue_create().
79 * This new value combines the attributes specified by the 'attr' parameter and
80 * the overcommit flag.
82 API_AVAILABLE(macos(10.10), ios(8.0))
83 DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW
85 dispatch_queue_attr_make_with_overcommit(dispatch_queue_attr_t _Nullable attr
,
89 * @typedef dispatch_queue_priority_t
91 * @constant DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE
92 * Items dispatched to the queue will run at non-interactive priority.
93 * This priority level is intended for user-initiated application activity that
94 * is long-running and CPU or IO intensive and that the user is actively waiting
95 * on, but that should not interfere with interactive use of the application.
97 * This global queue priority level is mapped to QOS_CLASS_UTILITY.
99 #define DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE INT8_MIN
102 * @function dispatch_queue_set_label_nocopy
105 * Set the label for a given queue, without copying the input string.
108 * The queue must have been initially created with a NULL label, else using
109 * this function to set the queue label is undefined.
111 * The caller of this function must make sure the label pointer remains valid
112 * while it is used as the queue label and while any callers to
113 * dispatch_queue_get_label() may have obtained it. Since the queue lifetime
114 * may extend past the last release, it is advised to call this function with
115 * a constant string or NULL before the queue is released, or to destroy the
116 * label from a finalizer for that queue.
118 * This function should be called before any work item could call
119 * dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) or from the context of
123 * The queue to adjust. Attempts to set the label of the main queue or a global
124 * concurrent queue will be ignored.
127 * The new label for the queue.
129 API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
130 DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW
132 dispatch_queue_set_label_nocopy(dispatch_queue_t queue
, const char *label
);
135 * @function dispatch_queue_set_width
138 * Set the width of concurrency for a given queue. The width of a serial queue
142 * This SPI is DEPRECATED and will be removed in a future release.
143 * Uses of this SPI to make a queue concurrent by setting its width to LONG_MAX
144 * should be replaced by passing DISPATCH_QUEUE_CONCURRENT to
145 * dispatch_queue_create().
146 * Uses of this SPI to limit queue concurrency are not recommended and should
147 * be replaced by alternative mechanisms such as a dispatch semaphore created
148 * with the desired concurrency width.
151 * The queue to adjust. Attempts to set the width of the main queue or a global
152 * concurrent queue will be ignored.
155 * The new maximum width of concurrency depending on available resources.
156 * If zero is passed, then the value is promoted to one.
157 * Negative values are magic values that map to automatic width values.
158 * Unknown negative values default to DISPATCH_QUEUE_WIDTH_MAX_LOGICAL_CPUS.
160 #define DISPATCH_QUEUE_WIDTH_ACTIVE_CPUS -1
161 #define DISPATCH_QUEUE_WIDTH_MAX_PHYSICAL_CPUS -2
162 #define DISPATCH_QUEUE_WIDTH_MAX_LOGICAL_CPUS -3
164 API_DEPRECATED("Use dispatch_queue_create(name, DISPATCH_QUEUE_CONCURRENT)",
165 macos(10.6,10.10), ios(4.0,8.0))
166 DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
168 dispatch_queue_set_width(dispatch_queue_t dq
, long width
);
172 * @function dispatch_pthread_root_queue_create
175 * Creates a new concurrent dispatch root queue with a pthread-based pool of
176 * worker threads owned by the application.
179 * Dispatch pthread root queues are similar to the global concurrent dispatch
180 * queues in that they invoke blocks concurrently, however the blocks are not
181 * executed on ordinary worker threads but use a dedicated pool of pthreads not
182 * shared with the global queues or any other pthread root queues.
184 * NOTE: this is a special-purpose facility that should only be used in very
185 * limited circumstances, in almost all cases the global concurrent queues
186 * should be preferred. While this facility allows for more flexibility in
187 * configuring worker threads for special needs it comes at the cost of
188 * increased overall memory usage due to reduced thread sharing and higher
189 * latency in worker thread bringup.
191 * Dispatch pthread root queues do not support suspension, application context
192 * and change of width or of target queue. They can however be used as the
193 * target queue for serial or concurrent queues obtained via
194 * dispatch_queue_create() or dispatch_queue_create_with_target(), which
195 * enables the blocks submitted to those queues to be processed on the root
196 * queue's pthread pool.
198 * When a dispatch pthread root queue is no longer needed, it should be
199 * released with dispatch_release(). Existing worker pthreads and pending blocks
200 * submitted to the root queue will hold a reference to the queue so it will not
201 * be deallocated until all blocks have finished and worker threads exited.
204 * A string label to attach to the queue.
205 * This parameter is optional and may be NULL.
208 * Pass flags value returned by dispatch_pthread_root_queue_flags_pool_size()
212 * Attributes passed to pthread_create(3) when creating worker pthreads. This
213 * parameter is copied and can be destroyed after this call returns.
214 * This parameter is optional and may be NULL.
217 * Configuration block called on newly created worker pthreads before any blocks
218 * for the root queue are executed. The block may configure the current thread
220 * This parameter is optional and may be NULL.
223 * The newly created dispatch pthread root queue.
225 API_AVAILABLE(macos(10.9), ios(6.0))
226 DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT
229 dispatch_pthread_root_queue_create(const char *_Nullable label
,
230 unsigned long flags
, const pthread_attr_t
*_Nullable attr
,
231 dispatch_block_t _Nullable configure
);
234 * @function dispatch_pthread_root_queue_flags_pool_size
237 * Returns flags argument to pass to dispatch_pthread_root_queue_create() to
238 * specify the maximum size of the pthread pool to use for a pthread root queue.
241 * Maximum size of the pthread pool to use for the root queue. The number of
242 * pthreads created for this root queue will never exceed this number but there
243 * is no guarantee that the specified number will be reached.
244 * Pass 0 to specify that a default pool size determined by the system should
246 * NOTE: passing pool_size == 1 does NOT make the pthread root queue equivalent
250 * The flags argument to pass to dispatch_pthread_root_queue_create().
252 DISPATCH_INLINE DISPATCH_ALWAYS_INLINE
254 dispatch_pthread_root_queue_flags_pool_size(uint8_t pool_size
)
256 #define _DISPATCH_PTHREAD_ROOT_QUEUE_FLAG_POOL_SIZE (0x80000000ul)
257 return (_DISPATCH_PTHREAD_ROOT_QUEUE_FLAG_POOL_SIZE
|
258 (unsigned long)pool_size
);
261 #endif /* __BLOCKS__ */
264 * @function dispatch_pthread_root_queue_copy_current
267 * Returns a reference to the pthread root queue object that has created the
268 * currently executing thread, or NULL if the current thread is not associated
269 * to a pthread root queue.
272 * A new reference to a pthread root queue object or NULL.
274 API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
275 DISPATCH_EXPORT DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT DISPATCH_NOTHROW
276 dispatch_queue_t _Nullable
277 dispatch_pthread_root_queue_copy_current(void);
280 * @constant DISPATCH_APPLY_CURRENT_ROOT_QUEUE
283 * This constant is deprecated, please use DISPATCH_APPLY_AUTO.
285 * DISPATCH_APPLY_AUTO also selects the current pthread root queue if
288 #define DISPATCH_APPLY_CURRENT_ROOT_QUEUE ((dispatch_queue_t _Nonnull)0)
291 * @function dispatch_async_enforce_qos_class_f
294 * Submits a function for asynchronous execution on a dispatch queue.
297 * See dispatch_async() for details. The QOS will be enforced as if
300 * dispatch_async(queue, dispatch_block_create(DISPATCH_BLOCK_ENFORCE_QOS_CLASS, ^{
306 * The target dispatch queue to which the function is submitted.
307 * The system will hold a reference on the target queue until the function
309 * The result of passing NULL in this parameter is undefined.
312 * The application-defined context parameter to pass to the function.
315 * The application-defined function to invoke on the target queue. The first
316 * parameter passed to this function is the context provided to
317 * dispatch_async_f().
318 * The result of passing NULL in this parameter is undefined.
320 API_AVAILABLE(macos(10.11), ios(9.0))
321 DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW
323 dispatch_async_enforce_qos_class_f(dispatch_queue_t queue
,
324 void *_Nullable context
, dispatch_function_t work
);
329 * @function _dispatch_install_thread_detach_callback
332 * Function to be called before each worker thread exits to detach JVM.
334 * Hook to be able to detach threads from the Java JVM before they exit.
335 * If JNI has been used on a thread on Android it needs to have been
336 * "detached" before the thread exits or the application will crash.
339 void _dispatch_install_thread_detach_callback(dispatch_function_t cb
);
344 DISPATCH_ASSUME_NONNULL_END