| 1 | /* |
| 2 | * Copyright (c) 2008-2012 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_OBJECT__ |
| 22 | #define __DISPATCH_OBJECT__ |
| 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 | #if __has_include(<sys/qos.h>) |
| 30 | #include <sys/qos.h> |
| 31 | #endif |
| 32 | |
| 33 | DISPATCH_ASSUME_NONNULL_BEGIN |
| 34 | DISPATCH_ASSUME_ABI_SINGLE_BEGIN |
| 35 | |
| 36 | /*! |
| 37 | * @typedef dispatch_object_t |
| 38 | * |
| 39 | * @abstract |
| 40 | * Abstract base type for all dispatch objects. |
| 41 | * The details of the type definition are language-specific. |
| 42 | * |
| 43 | * @discussion |
| 44 | * Dispatch objects are reference counted via calls to dispatch_retain() and |
| 45 | * dispatch_release(). |
| 46 | */ |
| 47 | |
| 48 | #if OS_OBJECT_USE_OBJC |
| 49 | /* |
| 50 | * By default, dispatch objects are declared as Objective-C types when building |
| 51 | * with an Objective-C compiler. This allows them to participate in ARC, in RR |
| 52 | * management by the Blocks runtime and in leaks checking by the static |
| 53 | * analyzer, and enables them to be added to Cocoa collections. |
| 54 | * See <os/object.h> for details. |
| 55 | */ |
| 56 | DISPATCH_SWIFT_NAME(DispatchObject) OS_OBJECT_DECL_CLASS(dispatch_object); |
| 57 | |
| 58 | #if OS_OBJECT_SWIFT3 |
| 59 | #define DISPATCH_DECL(name) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, dispatch_object) |
| 60 | #define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, base) |
| 61 | /* |
| 62 | * DISPATCH_DECL_FACTORY_CLASS_SWIFT adopts _hasMissingDesignatedInitializers swift attribute. |
| 63 | * That makes subclasses of this class stop inheriting its initializers. |
| 64 | */ |
| 65 | #define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) \ |
| 66 | 		OS_OBJECT_SWIFT_HAS_MISSING_DESIGNATED_INIT DISPATCH_DECL_SWIFT(name, swift_name) |
| 67 | #define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL(name) |
| 68 | #define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) \ |
| 69 | 		DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL_SUBCLASS(name, base) |
| 70 | |
| 71 | /* |
| 72 | * DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT is for declaring subclasses of a serial executor base class. |
| 73 | */ |
| 74 | #if DISPATCH_OSX_SUPPORTS_AT_LEAST(140000, 170000, 170000, 100000, 90400, 10000) |
| 75 | #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \ |
| 76 | 	DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue_serial_executor, swift_name) |
| 77 | #else |
| 78 | #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \ |
| 79 | 	DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name) |
| 80 | #endif |
| 81 | |
| 82 | #else // OS_OBJECT_SWIFT3 |
| 83 | #define DISPATCH_DECL(name) OS_OBJECT_DECL_SUBCLASS(name, dispatch_object) |
| 84 | #define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SUBCLASS(name, base) |
| 85 | #define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) DISPATCH_DECL_SWIFT(name, swift_name) |
| 86 | #define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_DECL(name) |
| 87 | #define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) DISPATCH_DECL_SUBCLASS(name, base) |
| 88 | #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \ |
| 89 | 		DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name) |
| 90 | DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 91 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 92 | void |
| 93 | _dispatch_object_validate(dispatch_object_t object) |
| 94 | { |
| 95 | 	void *isa = *(void *volatile*)(OS_OBJECT_BRIDGE void*)object; |
| 96 | 	(void)isa; |
| 97 | } |
| 98 | #endif // OS_OBJECT_SWIFT3 |
| 99 | |
| 100 | #define DISPATCH_GLOBAL_OBJECT(type, object) ((OS_OBJECT_BRIDGE type)&(object)) |
| 101 | #define DISPATCH_RETURNS_RETAINED OS_OBJECT_RETURNS_RETAINED |
| 102 | #elif defined(__cplusplus) && !defined(__DISPATCH_BUILDING_DISPATCH__) |
| 103 | /* |
| 104 | * Dispatch objects are NOT C++ objects. Nevertheless, we can at least keep C++ |
| 105 | * aware of type compatibility. |
| 106 | */ |
| 107 | typedef struct dispatch_object_s { |
| 108 | private: |
| 109 | 	dispatch_object_s(); |
| 110 | 	~dispatch_object_s(); |
| 111 | 	dispatch_object_s(const dispatch_object_s &); |
| 112 | 	void operator=(const dispatch_object_s &); |
| 113 | } *dispatch_object_t; |
| 114 | #define DISPATCH_DECL(name) \ |
| 115 | 		typedef struct name##_s : public dispatch_object_s {} *name##_t |
| 116 | #define DISPATCH_DECL_SUBCLASS(name, base) \ |
| 117 | 		typedef struct name##_s : public base##_s {} *name##_t |
| 118 | #define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) DISPATCH_DECL_SWIFT(name, swift_name) |
| 119 | #define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_DECL(name) |
| 120 | #define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) DISPATCH_DECL_SUBCLASS(name, base) |
| 121 | #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \ |
| 122 | 		DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name) |
| 123 | #define DISPATCH_GLOBAL_OBJECT(type, object) (static_cast<type>(&(object))) |
| 124 | #define DISPATCH_RETURNS_RETAINED |
| 125 | #else /* Plain C */ |
| 126 | typedef union { |
| 127 | 	struct _os_object_s *_os_obj; |
| 128 | 	struct dispatch_object_s *_do; |
| 129 | 	struct dispatch_queue_s *_dq; |
| 130 | 	struct dispatch_queue_attr_s *_dqa; |
| 131 | 	struct dispatch_group_s *_dg; |
| 132 | 	struct dispatch_source_s *_ds; |
| 133 | 	struct dispatch_channel_s *_dch; |
| 134 | 	struct dispatch_mach_s *_dm; |
| 135 | 	struct dispatch_mach_msg_s *_dmsg; |
| 136 | 	struct dispatch_semaphore_s *_dsema; |
| 137 | 	struct dispatch_data_s *_ddata; |
| 138 | 	struct dispatch_io_s *_dchannel; |
| 139 | } dispatch_object_t DISPATCH_TRANSPARENT_UNION; |
| 140 | #define DISPATCH_DECL(name) typedef struct name##_s *name##_t |
| 141 | #define DISPATCH_DECL_SUBCLASS(name, base) typedef base##_t name##_t |
| 142 | #define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) DISPATCH_DECL_SWIFT(name, swift_name) |
| 143 | #define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_DECL(name) |
| 144 | #define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) DISPATCH_DECL_SUBCLASS(name, base) |
| 145 | #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \ |
| 146 | 		DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name) |
| 147 | #define DISPATCH_GLOBAL_OBJECT(type, object) ((type)&(object)) |
| 148 | #define DISPATCH_RETURNS_RETAINED |
| 149 | #endif |
| 150 | |
| 151 | #if OS_OBJECT_SWIFT3 && OS_OBJECT_USE_OBJC |
| 152 | #define DISPATCH_SOURCE_TYPE_DECL(name) \ |
| 153 | 		DISPATCH_EXPORT struct dispatch_source_type_s \ |
| 154 | 				_dispatch_source_type_##name; \ |
| 155 | 		OS_OBJECT_DECL_PROTOCOL(dispatch_source_##name, <OS_dispatch_source>); \ |
| 156 | 		OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL( \ |
| 157 | 				dispatch_source, dispatch_source_##name) |
| 158 | #define DISPATCH_SOURCE_TYPE_DECL_SWIFT(name, swift_name) \ |
| 159 | 		DISPATCH_EXPORT struct dispatch_source_type_s \ |
| 160 | 				_dispatch_source_type_##name; \ |
| 161 | 		DISPATCH_SWIFT_NAME(swift_name) \ |
| 162 | 		OS_OBJECT_SWIFT_SENDABLE \ |
| 163 | 		OS_OBJECT_DECL_PROTOCOL(dispatch_source_##name, <OS_dispatch_source>); \ |
| 164 | 		OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL( \ |
| 165 | 				dispatch_source, dispatch_source_##name) |
| 166 | #define DISPATCH_SOURCE_DECL(name) \ |
| 167 | 		DISPATCH_DECL(name); \ |
| 168 | 		OS_OBJECT_DECL_PROTOCOL(name, <NSObject>); \ |
| 169 | 		OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, name) |
| 170 | #define DISPATCH_SOURCE_DECL_SWIFT(name, swift_name, protocol_name) \ |
| 171 | 		DISPATCH_SWIFT_NAME(swift_name) \ |
| 172 | 		DISPATCH_DECL(name); \ |
| 173 | 		DISPATCH_SWIFT_NAME(protocol_name) \ |
| 174 | 		OS_OBJECT_DECL_PROTOCOL(name, <NSObject>); \ |
| 175 | 		OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, name) |
| 176 | #ifndef DISPATCH_DATA_DECL |
| 177 | #define DISPATCH_DATA_DECL(name) OS_OBJECT_DECL_SENDABLE_SWIFT(name) |
| 178 | #endif // DISPATCH_DATA_DECL |
| 179 | #define DISPATCH_DATA_DECL_SWIFT(name, swift_name) \ |
| 180 | 		DISPATCH_SWIFT_NAME(swift_name) \ |
| 181 | 		DISPATCH_DATA_DECL(name) |
| 182 | #else |
| 183 | #define DISPATCH_SOURCE_DECL(name) \ |
| 184 | 		DISPATCH_DECL(name); |
| 185 | #define DISPATCH_SOURCE_DECL_SWIFT(name, swift_name, protocol_name) DISPATCH_SOURCE_DECL(name) |
| 186 | #define DISPATCH_DATA_DECL(name) DISPATCH_DECL(name) |
| 187 | #define DISPATCH_DATA_DECL_SWIFT(name, swift_name) DISPATCH_DATA_DECL(name) |
| 188 | #define DISPATCH_SOURCE_TYPE_DECL(name) \ |
| 189 | 		DISPATCH_EXPORT const struct dispatch_source_type_s \ |
| 190 | 		_dispatch_source_type_##name |
| 191 | #define DISPATCH_SOURCE_TYPE_DECL_SWIFT(name, swift_name) \ |
| 192 | 		DISPATCH_SOURCE_TYPE_DECL(name) |
| 193 | #endif |
| 194 | |
| 195 | #ifdef __BLOCKS__ |
| 196 | /*! |
| 197 | * @typedef dispatch_block_t |
| 198 | * |
| 199 | * @abstract |
| 200 | * The type of blocks submitted to dispatch queues, which take no arguments |
| 201 | * and have no return value. |
| 202 | * |
| 203 | * @discussion |
| 204 | * When not building with Objective-C ARC, a block object allocated on or |
| 205 | * copied to the heap must be released with a -[release] message or the |
| 206 | * Block_release() function. |
| 207 | * |
| 208 | * The declaration of a block literal allocates storage on the stack. |
| 209 | * Therefore, this is an invalid construct: |
| 210 | * <code> |
| 211 | * dispatch_block_t block; |
| 212 | * if (x) { |
| 213 | * block = ^{ printf("true\n"); }; |
| 214 | * } else { |
| 215 | * block = ^{ printf("false\n"); }; |
| 216 | * } |
| 217 | * block(); // unsafe!!! |
| 218 | * </code> |
| 219 | * |
| 220 | * What is happening behind the scenes: |
| 221 | * <code> |
| 222 | * if (x) { |
| 223 | * struct Block __tmp_1 = ...; // setup details |
| 224 | * block = &__tmp_1; |
| 225 | * } else { |
| 226 | * struct Block __tmp_2 = ...; // setup details |
| 227 | * block = &__tmp_2; |
| 228 | * } |
| 229 | * </code> |
| 230 | * |
| 231 | * As the example demonstrates, the address of a stack variable is escaping the |
| 232 | * scope in which it is allocated. That is a classic C bug. |
| 233 | * |
| 234 | * Instead, the block literal must be copied to the heap with the Block_copy() |
| 235 | * function or by sending it a -[copy] message. |
| 236 | */ |
| 237 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 238 | typedef void (^dispatch_block_t)(void); |
| 239 | #endif // __BLOCKS__ |
| 240 | |
| 241 | __BEGIN_DECLS |
| 242 | |
| 243 | /*! |
| 244 | * @typedef dispatch_qos_class_t |
| 245 | * Alias for qos_class_t type. |
| 246 | */ |
| 247 | DISPATCH_SWIFT_UNAVAILABLE("Use DispatchQoS") |
| 248 | #if __has_include(<sys/qos.h>) |
| 249 | typedef qos_class_t dispatch_qos_class_t; |
| 250 | #else |
| 251 | typedef unsigned int dispatch_qos_class_t; |
| 252 | #endif |
| 253 | |
| 254 | /*! |
| 255 | * @function dispatch_retain |
| 256 | * |
| 257 | * @abstract |
| 258 | * Increment the reference count of a dispatch object. |
| 259 | * |
| 260 | * @discussion |
| 261 | * Calls to dispatch_retain() must be balanced with calls to |
| 262 | * dispatch_release(). |
| 263 | * |
| 264 | * @param object |
| 265 | * The object to retain. |
| 266 | * The result of passing NULL in this parameter is undefined. |
| 267 | */ |
| 268 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 269 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 270 | DISPATCH_SWIFT_UNAVAILABLE("Can't be used with ARC") |
| 271 | void |
| 272 | dispatch_retain(dispatch_object_t object); |
| 273 | #if OS_OBJECT_USE_OBJC_RETAIN_RELEASE |
| 274 | #undef dispatch_retain |
| 275 | #define dispatch_retain(object) \ |
| 276 | 		__extension__({ dispatch_object_t _o = (object); \ |
| 277 | 		_dispatch_object_validate(_o); (void)[_o retain]; }) |
| 278 | #endif |
| 279 | |
| 280 | /*! |
| 281 | * @function dispatch_release |
| 282 | * |
| 283 | * @abstract |
| 284 | * Decrement the reference count of a dispatch object. |
| 285 | * |
| 286 | * @discussion |
| 287 | * A dispatch object is asynchronously deallocated once all references are |
| 288 | * released (i.e. the reference count becomes zero). The system does not |
| 289 | * guarantee that a given client is the last or only reference to a given |
| 290 | * object. |
| 291 | * |
| 292 | * @param object |
| 293 | * The object to release. |
| 294 | * The result of passing NULL in this parameter is undefined. |
| 295 | */ |
| 296 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 297 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 298 | DISPATCH_SWIFT_UNAVAILABLE("Can't be used with ARC") |
| 299 | void |
| 300 | dispatch_release(dispatch_object_t object); |
| 301 | #if OS_OBJECT_USE_OBJC_RETAIN_RELEASE |
| 302 | #undef dispatch_release |
| 303 | #define dispatch_release(object) \ |
| 304 | 		__extension__({ dispatch_object_t _o = (object); \ |
| 305 | 		_dispatch_object_validate(_o); [_o release]; }) |
| 306 | #endif |
| 307 | |
| 308 | /*! |
| 309 | * @function dispatch_get_context |
| 310 | * |
| 311 | * @abstract |
| 312 | * Returns the application defined context of the object. |
| 313 | * |
| 314 | * @param object |
| 315 | * The result of passing NULL in this parameter is undefined. |
| 316 | * |
| 317 | * @result |
| 318 | * The context of the object; may be NULL. |
| 319 | */ |
| 320 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 321 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_PURE DISPATCH_WARN_RESULT |
| 322 | DISPATCH_NOTHROW |
| 323 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 324 | void *_Nullable |
| 325 | dispatch_get_context(dispatch_object_t object); |
| 326 | |
| 327 | /*! |
| 328 | * @function dispatch_set_context |
| 329 | * |
| 330 | * @abstract |
| 331 | * Associates an application defined context with the object. |
| 332 | * |
| 333 | * @param object |
| 334 | * The result of passing NULL in this parameter is undefined. |
| 335 | * |
| 336 | * @param context |
| 337 | * The new client defined context for the object. This may be NULL. |
| 338 | * |
| 339 | */ |
| 340 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 341 | DISPATCH_EXPORT DISPATCH_NOTHROW |
| 342 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 343 | void |
| 344 | dispatch_set_context(dispatch_object_t object, void *_Nullable context); |
| 345 | |
| 346 | /*! |
| 347 | * @function dispatch_set_finalizer_f |
| 348 | * |
| 349 | * @abstract |
| 350 | * Set the finalizer function for a dispatch object. |
| 351 | * |
| 352 | * @param object |
| 353 | * The dispatch object to modify. |
| 354 | * The result of passing NULL in this parameter is undefined. |
| 355 | * |
| 356 | * @param finalizer |
| 357 | * The finalizer function pointer. |
| 358 | * |
| 359 | * @discussion |
| 360 | * A dispatch object's finalizer will be invoked on the object's target queue |
| 361 | * after all references to the object have been released. This finalizer may be |
| 362 | * used by the application to release any resources associated with the object, |
| 363 | * such as freeing the object's context. |
| 364 | * The context parameter passed to the finalizer function is the current |
| 365 | * context of the dispatch object at the time the finalizer call is made. |
| 366 | */ |
| 367 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 368 | DISPATCH_EXPORT DISPATCH_NOTHROW |
| 369 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 370 | void |
| 371 | dispatch_set_finalizer_f(dispatch_object_t object, |
| 372 | 		dispatch_function_t _Nullable finalizer); |
| 373 | |
| 374 | /*! |
| 375 | * @function dispatch_activate |
| 376 | * |
| 377 | * @abstract |
| 378 | * Activates the specified dispatch object. |
| 379 | * |
| 380 | * @discussion |
| 381 | * Dispatch objects such as queues and sources may be created in an inactive |
| 382 | * state. Objects in this state have to be activated before any blocks |
| 383 | * associated with them will be invoked. |
| 384 | * |
| 385 | * The target queue of inactive objects can be changed using |
| 386 | * dispatch_set_target_queue(). Change of target queue is no longer permitted |
| 387 | * once an initially inactive object has been activated. |
| 388 | * |
| 389 | * Calling dispatch_activate() on an active object has no effect. |
| 390 | * Releasing the last reference count on an inactive object is undefined. |
| 391 | * |
| 392 | * @param object |
| 393 | * The object to be activated. |
| 394 | * The result of passing NULL in this parameter is undefined. |
| 395 | */ |
| 396 | API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) |
| 397 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 398 | DISPATCH_SWIFT_NAME(DispatchObject.activate(self:)) |
| 399 | void |
| 400 | dispatch_activate(dispatch_object_t object); |
| 401 | |
| 402 | /*! |
| 403 | * @function dispatch_suspend |
| 404 | * |
| 405 | * @abstract |
| 406 | * Suspends the invocation of blocks on a dispatch object. |
| 407 | * |
| 408 | * @discussion |
| 409 | * A suspended object will not invoke any blocks associated with it. The |
| 410 | * suspension of an object will occur after any running block associated with |
| 411 | * the object completes. |
| 412 | * |
| 413 | * Calls to dispatch_suspend() must be balanced with calls |
| 414 | * to dispatch_resume(). |
| 415 | * |
| 416 | * @param object |
| 417 | * The object to be suspended. |
| 418 | * The result of passing NULL in this parameter is undefined. |
| 419 | */ |
| 420 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 421 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 422 | DISPATCH_SWIFT_NAME(DispatchObject.suspend(self:)) |
| 423 | void |
| 424 | dispatch_suspend(dispatch_object_t object); |
| 425 | |
| 426 | /*! |
| 427 | * @function dispatch_resume |
| 428 | * |
| 429 | * @abstract |
| 430 | * Resumes the invocation of blocks on a dispatch object. |
| 431 | * |
| 432 | * @discussion |
| 433 | * Dispatch objects can be suspended with dispatch_suspend(), which increments |
| 434 | * an internal suspension count. dispatch_resume() is the inverse operation, |
| 435 | * and consumes suspension counts. When the last suspension count is consumed, |
| 436 | * blocks associated with the object will be invoked again. |
| 437 | * |
| 438 | * For backward compatibility reasons, dispatch_resume() on an inactive and not |
| 439 | * otherwise suspended dispatch source object has the same effect as calling |
| 440 | * dispatch_activate(). For new code, using dispatch_activate() is preferred. |
| 441 | * |
| 442 | * If the specified object has zero suspension count and is not an inactive |
| 443 | * source, this function will result in an assertion and the process being |
| 444 | * terminated. |
| 445 | * |
| 446 | * @param object |
| 447 | * The object to be resumed. |
| 448 | * The result of passing NULL in this parameter is undefined. |
| 449 | */ |
| 450 | API_AVAILABLE(macos(10.6), ios(4.0)) |
| 451 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 452 | DISPATCH_SWIFT_NAME(DispatchObject.resume(self:)) |
| 453 | void |
| 454 | dispatch_resume(dispatch_object_t object); |
| 455 | |
| 456 | /*! |
| 457 | * @function dispatch_set_qos_class_floor |
| 458 | * |
| 459 | * @abstract |
| 460 | * Sets the QOS class floor on a dispatch queue, source or workloop. |
| 461 | * |
| 462 | * @discussion |
| 463 | * The QOS class of workitems submitted to this object asynchronously will be |
| 464 | * elevated to at least the specified QOS class floor. The QOS of the workitem |
| 465 | * will be used if higher than the floor even when the workitem has been created |
| 466 | * without "ENFORCE" semantics. |
| 467 | * |
| 468 | * Setting the QOS class floor is equivalent to the QOS effects of configuring |
| 469 | * a queue whose target queue has a QoS class set to the same value. |
| 470 | * |
| 471 | * @param object |
| 472 | * A dispatch queue, workloop, or source to configure. |
| 473 | * The object must be inactive. |
| 474 | * |
| 475 | * Passing another object type or an object that has been activated is undefined |
| 476 | * and will cause the process to be terminated. |
| 477 | * |
| 478 | * @param qos_class |
| 479 | * A QOS class value: |
| 480 | * - QOS_CLASS_USER_INTERACTIVE |
| 481 | * - QOS_CLASS_USER_INITIATED |
| 482 | * - QOS_CLASS_DEFAULT |
| 483 | * - QOS_CLASS_UTILITY |
| 484 | * - QOS_CLASS_BACKGROUND |
| 485 | * Passing any other value is undefined. |
| 486 | * |
| 487 | * @param relative_priority |
| 488 | * A relative priority within the QOS class. This value is a negative |
| 489 | * offset from the maximum supported scheduler priority for the given class. |
| 490 | * Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY |
| 491 | * is undefined. |
| 492 | */ |
| 493 | API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) |
| 494 | DISPATCH_EXPORT DISPATCH_NOTHROW |
| 495 | DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift") |
| 496 | void |
| 497 | dispatch_set_qos_class_floor(dispatch_object_t object, |
| 498 | 		dispatch_qos_class_t qos_class, int relative_priority); |
| 499 | |
| 500 | #ifdef __BLOCKS__ |
| 501 | /*! |
| 502 | * @function dispatch_wait |
| 503 | * |
| 504 | * @abstract |
| 505 | * Wait synchronously for an object or until the specified timeout has elapsed. |
| 506 | * |
| 507 | * @discussion |
| 508 | * Type-generic macro that maps to dispatch_block_wait, dispatch_group_wait or |
| 509 | * dispatch_semaphore_wait, depending on the type of the first argument. |
| 510 | * See documentation for these functions for more details. |
| 511 | * This function is unavailable for any other object type. |
| 512 | * |
| 513 | * @param object |
| 514 | * The object to wait on. |
| 515 | * The result of passing NULL in this parameter is undefined. |
| 516 | * |
| 517 | * @param timeout |
| 518 | * When to timeout (see dispatch_time). As a convenience, there are the |
| 519 | * DISPATCH_TIME_NOW and DISPATCH_TIME_FOREVER constants. |
| 520 | * |
| 521 | * @result |
| 522 | * Returns zero on success or non-zero on error (i.e. timed out). |
| 523 | */ |
| 524 | DISPATCH_UNAVAILABLE |
| 525 | DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW |
| 526 | intptr_t |
| 527 | dispatch_wait(void *object, dispatch_time_t timeout); |
| 528 | #if __has_extension(c_generic_selections) |
| 529 | #define dispatch_wait(object, timeout) \ |
| 530 | 		_Generic((object), \ |
| 531 | 			dispatch_block_t:dispatch_block_wait, \ |
| 532 | 			dispatch_group_t:dispatch_group_wait, \ |
| 533 | 			dispatch_semaphore_t:dispatch_semaphore_wait \ |
| 534 | 		)((object),(timeout)) |
| 535 | #endif |
| 536 | |
| 537 | /*! |
| 538 | * @function dispatch_notify |
| 539 | * |
| 540 | * @abstract |
| 541 | * Schedule a notification block to be submitted to a queue when the execution |
| 542 | * of a specified object has completed. |
| 543 | * |
| 544 | * @discussion |
| 545 | * Type-generic macro that maps to dispatch_block_notify or |
| 546 | * dispatch_group_notify, depending on the type of the first argument. |
| 547 | * See documentation for these functions for more details. |
| 548 | * This function is unavailable for any other object type. |
| 549 | * |
| 550 | * @param object |
| 551 | * The object to observe. |
| 552 | * The result of passing NULL in this parameter is undefined. |
| 553 | * |
| 554 | * @param queue |
| 555 | * The queue to which the supplied notification block will be submitted when |
| 556 | * the observed object completes. |
| 557 | * |
| 558 | * @param notification_block |
| 559 | * The block to submit when the observed object completes. |
| 560 | */ |
| 561 | DISPATCH_UNAVAILABLE |
| 562 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 563 | void |
| 564 | dispatch_notify(void *object, dispatch_object_t queue, |
| 565 | 		dispatch_block_t notification_block); |
| 566 | #if __has_extension(c_generic_selections) |
| 567 | #define dispatch_notify(object, queue, notification_block) \ |
| 568 | 		_Generic((object), \ |
| 569 | 			dispatch_block_t:dispatch_block_notify, \ |
| 570 | 			dispatch_group_t:dispatch_group_notify \ |
| 571 | 		)((object),(queue), (notification_block)) |
| 572 | #endif |
| 573 | |
| 574 | /*! |
| 575 | * @function dispatch_cancel |
| 576 | * |
| 577 | * @abstract |
| 578 | * Cancel the specified object. |
| 579 | * |
| 580 | * @discussion |
| 581 | * Type-generic macro that maps to dispatch_block_cancel or |
| 582 | * dispatch_source_cancel, depending on the type of the first argument. |
| 583 | * See documentation for these functions for more details. |
| 584 | * This function is unavailable for any other object type. |
| 585 | * |
| 586 | * @param object |
| 587 | * The object to cancel. |
| 588 | * The result of passing NULL in this parameter is undefined. |
| 589 | */ |
| 590 | DISPATCH_UNAVAILABLE |
| 591 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW |
| 592 | void |
| 593 | dispatch_cancel(void *object); |
| 594 | #if __has_extension(c_generic_selections) |
| 595 | #define dispatch_cancel(object) \ |
| 596 | 		_Generic((object), \ |
| 597 | 			dispatch_block_t:dispatch_block_cancel, \ |
| 598 | 			dispatch_source_t:dispatch_source_cancel \ |
| 599 | 		)((object)) |
| 600 | #endif |
| 601 | |
| 602 | /*! |
| 603 | * @function dispatch_testcancel |
| 604 | * |
| 605 | * @abstract |
| 606 | * Test whether the specified object has been canceled |
| 607 | * |
| 608 | * @discussion |
| 609 | * Type-generic macro that maps to dispatch_block_testcancel or |
| 610 | * dispatch_source_testcancel, depending on the type of the first argument. |
| 611 | * See documentation for these functions for more details. |
| 612 | * This function is unavailable for any other object type. |
| 613 | * |
| 614 | * @param object |
| 615 | * The object to test. |
| 616 | * The result of passing NULL in this parameter is undefined. |
| 617 | * |
| 618 | * @result |
| 619 | * Non-zero if canceled and zero if not canceled. |
| 620 | */ |
| 621 | DISPATCH_UNAVAILABLE |
| 622 | DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE |
| 623 | DISPATCH_NOTHROW |
| 624 | intptr_t |
| 625 | dispatch_testcancel(void *object); |
| 626 | #if __has_extension(c_generic_selections) |
| 627 | #define dispatch_testcancel(object) \ |
| 628 | 		_Generic((object), \ |
| 629 | 			dispatch_block_t:dispatch_block_testcancel, \ |
| 630 | 			dispatch_source_t:dispatch_source_testcancel \ |
| 631 | 		)((object)) |
| 632 | #endif |
| 633 | #endif // __BLOCKS__ |
| 634 | |
| 635 | /*! |
| 636 | * @function dispatch_debug |
| 637 | * |
| 638 | * @abstract |
| 639 | * Programmatically log debug information about a dispatch object. |
| 640 | * |
| 641 | * @discussion |
| 642 | * Programmatically log debug information about a dispatch object. By default, |
| 643 | * the log output is sent to syslog at notice level. In the debug version of |
| 644 | * the library, the log output is sent to a file in /var/tmp. |
| 645 | * The log output destination can be configured via the LIBDISPATCH_LOG |
| 646 | * environment variable, valid values are: YES, NO, syslog, stderr, file. |
| 647 | * |
| 648 | * This function is deprecated and will be removed in a future release. |
| 649 | * Objective-C callers may use -debugDescription instead. |
| 650 | * |
| 651 | * @param object |
| 652 | * The object to introspect. |
| 653 | * |
| 654 | * @param message |
| 655 | * The message to log above and beyond the introspection. |
| 656 | */ |
| 657 | API_DEPRECATED("unsupported interface", macos(10.6,10.9), ios(4.0,6.0)) |
| 658 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NOTHROW DISPATCH_COLD |
| 659 | __attribute__((__format__(printf,2,3))) |
| 660 | void |
| 661 | dispatch_debug(dispatch_object_t object, |
| 662 | 			 const char *DISPATCH_UNSAFE_INDEXABLE message, ...); |
| 663 | |
| 664 | API_DEPRECATED("unsupported interface", macos(10.6,10.9), ios(4.0,6.0)) |
| 665 | DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NOTHROW DISPATCH_COLD |
| 666 | __attribute__((__format__(printf,2,0))) |
| 667 | void |
| 668 | dispatch_debugv(dispatch_object_t object, |
| 669 | 				const char *DISPATCH_UNSAFE_INDEXABLE message, va_list ap); |
| 670 | |
| 671 | __END_DECLS |
| 672 | |
| 673 | DISPATCH_ASSUME_ABI_SINGLE_END |
| 674 | DISPATCH_ASSUME_NONNULL_END |
| 675 | |
| 676 | #endif |