+#pragma mark -
+#pragma mark dispatch_queue_attr_t
+
+#define DISPATCH_QUEUE_ATTR_INIT(qos, prio, overcommit, freq, concurrent, \
+ inactive) \
+ { \
+ DISPATCH_GLOBAL_OBJECT_HEADER(queue_attr), \
+ .dqa_qos_and_relpri = (_dispatch_priority_make(qos, prio) & \
+ DISPATCH_PRIORITY_REQUESTED_MASK), \
+ .dqa_overcommit = _dispatch_queue_attr_overcommit_##overcommit, \
+ .dqa_autorelease_frequency = DISPATCH_AUTORELEASE_FREQUENCY_##freq, \
+ .dqa_concurrent = (concurrent), \
+ .dqa_inactive = (inactive), \
+ }
+
+#define DISPATCH_QUEUE_ATTR_ACTIVE_INIT(qos, prio, overcommit, freq, \
+ concurrent) \
+ { \
+ [DQA_INDEX_ACTIVE] = DISPATCH_QUEUE_ATTR_INIT( \
+ qos, prio, overcommit, freq, concurrent, false), \
+ [DQA_INDEX_INACTIVE] = DISPATCH_QUEUE_ATTR_INIT( \
+ qos, prio, overcommit, freq, concurrent, true), \
+ }
+
+#define DISPATCH_QUEUE_ATTR_OVERCOMMIT_INIT(qos, prio, overcommit) \
+ { \
+ [DQA_INDEX_AUTORELEASE_FREQUENCY_INHERIT][DQA_INDEX_CONCURRENT] = \
+ DISPATCH_QUEUE_ATTR_ACTIVE_INIT( \
+ qos, prio, overcommit, INHERIT, 1), \
+ [DQA_INDEX_AUTORELEASE_FREQUENCY_INHERIT][DQA_INDEX_SERIAL] = \
+ DISPATCH_QUEUE_ATTR_ACTIVE_INIT( \
+ qos, prio, overcommit, INHERIT, 0), \
+ [DQA_INDEX_AUTORELEASE_FREQUENCY_WORK_ITEM][DQA_INDEX_CONCURRENT] = \
+ DISPATCH_QUEUE_ATTR_ACTIVE_INIT( \
+ qos, prio, overcommit, WORK_ITEM, 1), \
+ [DQA_INDEX_AUTORELEASE_FREQUENCY_WORK_ITEM][DQA_INDEX_SERIAL] = \
+ DISPATCH_QUEUE_ATTR_ACTIVE_INIT( \
+ qos, prio, overcommit, WORK_ITEM, 0), \
+ [DQA_INDEX_AUTORELEASE_FREQUENCY_NEVER][DQA_INDEX_CONCURRENT] = \
+ DISPATCH_QUEUE_ATTR_ACTIVE_INIT( \
+ qos, prio, overcommit, NEVER, 1), \
+ [DQA_INDEX_AUTORELEASE_FREQUENCY_NEVER][DQA_INDEX_SERIAL] = \
+ DISPATCH_QUEUE_ATTR_ACTIVE_INIT(\
+ qos, prio, overcommit, NEVER, 0), \
+ }
+
+#define DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, prio) \
+ [prio] = { \
+ [DQA_INDEX_UNSPECIFIED_OVERCOMMIT] = \
+ DISPATCH_QUEUE_ATTR_OVERCOMMIT_INIT(qos, -(prio), unspecified),\
+ [DQA_INDEX_NON_OVERCOMMIT] = \
+ DISPATCH_QUEUE_ATTR_OVERCOMMIT_INIT(qos, -(prio), disabled), \
+ [DQA_INDEX_OVERCOMMIT] = \
+ DISPATCH_QUEUE_ATTR_OVERCOMMIT_INIT(qos, -(prio), enabled), \
+ }
+
+#define DISPATCH_QUEUE_ATTR_PRIO_INIT(qos) \
+ { \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 0), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 1), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 2), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 3), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 4), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 5), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 6), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 7), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 8), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 9), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 10), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 11), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 12), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 13), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 14), \
+ DISPATCH_QUEUE_ATTR_PRIO_INITIALIZER(qos, 15), \
+ }
+
+#define DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(qos) \
+ [DQA_INDEX_QOS_CLASS_##qos] = \
+ DISPATCH_QUEUE_ATTR_PRIO_INIT(DISPATCH_QOS_##qos)
+
+// DISPATCH_QUEUE_CONCURRENT resp. _dispatch_queue_attr_concurrent is aliased
+// to array member [0][0][0][0][0][0] and their properties must match!
+const struct dispatch_queue_attr_s _dispatch_queue_attrs[]
+ [DISPATCH_QUEUE_ATTR_PRIO_COUNT]
+ [DISPATCH_QUEUE_ATTR_OVERCOMMIT_COUNT]
+ [DISPATCH_QUEUE_ATTR_AUTORELEASE_FREQUENCY_COUNT]
+ [DISPATCH_QUEUE_ATTR_CONCURRENCY_COUNT]
+ [DISPATCH_QUEUE_ATTR_INACTIVE_COUNT] = {
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(UNSPECIFIED),
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(MAINTENANCE),
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(BACKGROUND),
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(UTILITY),
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(DEFAULT),
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(USER_INITIATED),
+ DISPATCH_QUEUE_ATTR_QOS_INITIALIZER(USER_INTERACTIVE),
+};
+
+#if DISPATCH_VARIANT_STATIC
+// <rdar://problem/16778703>
+struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent =
+ DISPATCH_QUEUE_ATTR_INIT(QOS_CLASS_UNSPECIFIED, 0,
+ unspecified, INHERIT, 1, false);
+#endif // DISPATCH_VARIANT_STATIC
+
+// _dispatch_queue_attr_concurrent is aliased using libdispatch.aliases
+// and the -alias_list linker option on Darwin but needs to be done manually
+// for other platforms.
+#ifndef __APPLE__
+extern struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent
+ __attribute__((__alias__("_dispatch_queue_attrs")));
+#endif
+
+#pragma mark -
+#pragma mark dispatch_vtables
+
+DISPATCH_VTABLE_INSTANCE(semaphore,
+ .do_type = DISPATCH_SEMAPHORE_TYPE,
+ .do_kind = "semaphore",
+ .do_dispose = _dispatch_semaphore_dispose,
+ .do_debug = _dispatch_semaphore_debug,
+);
+
+DISPATCH_VTABLE_INSTANCE(group,
+ .do_type = DISPATCH_GROUP_TYPE,
+ .do_kind = "group",
+ .do_dispose = _dispatch_group_dispose,
+ .do_debug = _dispatch_group_debug,
+);
+
+DISPATCH_VTABLE_INSTANCE(queue,
+ .do_type = DISPATCH_QUEUE_LEGACY_TYPE,
+ .do_kind = "queue",
+ .do_dispose = _dispatch_queue_dispose,
+ .do_suspend = _dispatch_queue_suspend,
+ .do_resume = _dispatch_queue_resume,
+ .do_push = _dispatch_queue_push,
+ .do_invoke = _dispatch_queue_invoke,
+ .do_wakeup = _dispatch_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+ .do_set_targetq = _dispatch_queue_set_target_queue,
+);
+
+DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_serial, queue,
+ .do_type = DISPATCH_QUEUE_SERIAL_TYPE,
+ .do_kind = "serial-queue",
+ .do_dispose = _dispatch_queue_dispose,
+ .do_suspend = _dispatch_queue_suspend,
+ .do_resume = _dispatch_queue_resume,
+ .do_finalize_activation = _dispatch_queue_finalize_activation,
+ .do_push = _dispatch_queue_push,
+ .do_invoke = _dispatch_queue_invoke,
+ .do_wakeup = _dispatch_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+ .do_set_targetq = _dispatch_queue_set_target_queue,
+);
+
+DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_concurrent, queue,
+ .do_type = DISPATCH_QUEUE_CONCURRENT_TYPE,
+ .do_kind = "concurrent-queue",
+ .do_dispose = _dispatch_queue_dispose,
+ .do_suspend = _dispatch_queue_suspend,
+ .do_resume = _dispatch_queue_resume,
+ .do_finalize_activation = _dispatch_queue_finalize_activation,
+ .do_push = _dispatch_queue_push,
+ .do_invoke = _dispatch_queue_invoke,
+ .do_wakeup = _dispatch_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+ .do_set_targetq = _dispatch_queue_set_target_queue,
+);
+
+
+DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_root, queue,
+ .do_type = DISPATCH_QUEUE_GLOBAL_ROOT_TYPE,
+ .do_kind = "global-queue",
+ .do_dispose = _dispatch_pthread_root_queue_dispose,
+ .do_push = _dispatch_root_queue_push,
+ .do_invoke = NULL,
+ .do_wakeup = _dispatch_root_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+);
+
+
+DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_main, queue,
+ .do_type = DISPATCH_QUEUE_SERIAL_TYPE,
+ .do_kind = "main-queue",
+ .do_dispose = _dispatch_queue_dispose,
+ .do_push = _dispatch_queue_push,
+ .do_invoke = _dispatch_queue_invoke,
+ .do_wakeup = _dispatch_main_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+);
+
+DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_runloop, queue,
+ .do_type = DISPATCH_QUEUE_RUNLOOP_TYPE,
+ .do_kind = "runloop-queue",
+ .do_dispose = _dispatch_runloop_queue_dispose,
+ .do_push = _dispatch_queue_push,
+ .do_invoke = _dispatch_queue_invoke,
+ .do_wakeup = _dispatch_runloop_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+);
+
+DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_mgr, queue,
+ .do_type = DISPATCH_QUEUE_MGR_TYPE,
+ .do_kind = "mgr-queue",
+ .do_push = _dispatch_mgr_queue_push,
+ .do_invoke = _dispatch_mgr_thread,
+ .do_wakeup = _dispatch_mgr_queue_wakeup,
+ .do_debug = dispatch_queue_debug,
+);
+
+DISPATCH_VTABLE_INSTANCE(queue_specific_queue,
+ .do_type = DISPATCH_QUEUE_SPECIFIC_TYPE,
+ .do_kind = "queue-context",
+ .do_dispose = _dispatch_queue_specific_queue_dispose,
+ .do_push = (void *)_dispatch_queue_push,
+ .do_invoke = (void *)_dispatch_queue_invoke,
+ .do_wakeup = (void *)_dispatch_queue_wakeup,
+ .do_debug = (void *)dispatch_queue_debug,
+);
+
+DISPATCH_VTABLE_INSTANCE(queue_attr,