GCD Inside: GCD 数据结构
1 OS_object
OS_object
由下面宏OS_OBJECT_DEC_BASE
扩展而来:
// 1. os/object.h OS_OBJECT_DECL_BASE(object, NSObject); // 2. os/object.h #define OS_OBJECT_DECL_BASE(name, ...) \ @interface OS_OBJECT_CLASS(name) : __VA_ARGS__ \ - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); \ @end
扩展之后的结果为:
@interface OS_object : NSObject - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end
从扩展的结果来看,OS_object
继承自NSObject
。
OS_object
实现部分位于 src/object.m 中:
@implementation OS_OBJECT_CLASS(object) DISPATCH_UNAVAILABLE_INIT() -(id)retain { return _os_object_retain(self); } -(oneway void)release { return _os_object_release_without_xref_dispose(self); } -(NSUInteger)retainCount { return _os_object_retain_count(self); } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" -(BOOL)retainWeakReference { return _os_object_retain_weak(self); } -(BOOL)allowsWeakReference { return _os_object_allows_weak_reference(self); } #pragma clang diagnostic pop - (void)_xref_dispose { return _os_object_release_internal(self); } @end
宏OS_OBJECT_CLASS
的作用就是给宏参数加一个OS_
前缀,因此OS_OBJECT_CLASS(object)
扩展之后就是OS_object
。
GCD 源码为OS_object
定义了一个指针类型:
// 1. os/object_private.h typedef OS_OBJECT_CLASS(object) *_os_object_t;
上面代码中将宏扩展开,就是做了如下定义:
typdef OS_object *_os_object_t;
2 OS_dispatch_object
OS_dispatch_object
由宏OS_OBJECT_DECL_CLASS
扩展而来:
// 1. dispatch/object.h OS_OBJECT_DECL_CLASS(dispatch_object); // 2. os/object.h #define OS_OBJECT_DECL_CLASS(name) \ OS_OBJECT_DECL_SUBCLASS_SWIFT(name, object) // 3. os/object.h #define OS_OBJECT_DECL_SUBCLASS_SWIFT(name, super) \ OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE \ OS_OBJECT_DECL_IMPL_CLASS(name, OS_OBJECT_CLASS(super)) // 4. os/object.h #define OS_OBJECT_DECL_IMPL_CLASS(name, ...) \ OS_OBJECT_DECL_BASE(name, ## __VA_ARGS__) \ typedef OS_OBJECT_CLASS(name) \ * OS_OBJC_INDEPENDENT_CLASS name##_t
扩展之后的结果为:
@interface OS_dispatch_object : OS_object - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end typedef OS_dispatch_object *dispatch_object_t
从扩展结果看,OS_dispatch_object
继承自OS_object
。
上面注释 3 处的宏OS_OBJECT_OBJC_RUNTIME_VISIBLE
和注释 4 处的宏OS_OBJC_INDEPENDENT_CLASS
都是 Clang 编译器的属性,对数据结构本身没有影响,因此没有写出来。比如宏OS_OBJECT_OBJC_RUNTIME_VISIBLE
扩展之后就是:
__attribute__((objc_runtime_visible))
OS_dispatch_object
的实现位于 src/object.m 中:
@implementation DISPATCH_CLASS(object) DISPATCH_UNAVAILABLE_INIT() - (NSString *)debugDescription { Class nsstring = objc_lookUpClass("NSString"); if (!nsstring) return nil; char buf[2048]; struct dispatch_object_s *obj = (struct dispatch_object_s *)self; if (dx_vtable(obj)->do_debug) { dx_debug(obj, buf, sizeof(buf)); } else { strlcpy(buf, object_getClassName(self), sizeof(buf)); } NSString *format = [nsstring stringWithUTF8String:"<%s: %s>"]; if (!format) return nil; return [nsstring stringWithFormat:format, object_getClassName(self), buf]; } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wobjc-missing-super-calls" - (void)dealloc { return _dispatch_dispose(self); } #pragma clang diagnostic pop @end
宏DISPATCH_CLASS
的作用是在宏参数前面加上前缀OS_dispatch_
,因此DISPATCH_CLASS(object)
扩展之后就是OS_dispatch_object
。
3 OS_dispatch_queue
OS_dispatch_queue
由宏DISPATCH_DECL_FACTORY_CLASS_SWIFT
扩展而来:
// 1. dispatch/queue.h DISPATCH_DECL_FACTORY_CLASS_SWIFT(dispatch_queue, DispatchQueue); // 2. dispatch/object.h #define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) \ OS_OBJECT_SWIFT_HAS_MISSING_DESIGNATED_INIT DISPATCH_DECL_SWIFT(name, swift_name) // 3. dispatch/object.h #define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL(name) // 4. dispatch/object.h #define DISPATCH_DECL(name) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, dispatch_object) // 5. os/object.h #define OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, super) \ OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE OS_OBJECT_SWIFT_SENDABLE \ OS_OBJECT_DECL_IMPL_CLASS(name, OS_OBJECT_CLASS(super))
扩展之后的结果为:
@interface OS_dispatch_queue : OS_dispatch_object - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end typedef OS_dispatch_queue *dispatch_queue_t;
从扩展结果看OS_dispatch_queue
继承自OS_dispatch_object
。
OS_dispatch_queue
的实现部分位于 src/object.m 中:
@implementation DISPATCH_CLASS(queue) OS_OBJECT_NONLAZY_CLASS_LOAD DISPATCH_UNAVAILABLE_INIT() DISPATCH_OBJECT_USES_XREF_DISPOSE() - (NSString *)description { Class nsstring = objc_lookUpClass("NSString"); if (!nsstring) return nil; NSString *format = [nsstring stringWithUTF8String:"<%s: %s>"]; if (!format) return nil; return [nsstring stringWithFormat:format, object_getClassName(self), dispatch_queue_get_label(self), self]; } - (void)_xref_dispose { _dispatch_queue_xref_dispose((struct dispatch_queue_s *)self); [super _xref_dispose]; } @end
宏DISPATCH_CLASS(queue)
扩展之后就是OS_dispatch_queue
。
4 OS_dispatch_queue_serial
OS_dispatch_queue_serial
由宏DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT
扩展而来:
// 1. dispatch/queue.h DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(dispatch_queue_serial, DispatchSerialQueue); // 2. dispatch/object.h #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \ DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name) // 3. dispatch/object.h #define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) \ DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL_SUBCLASS(name, base) // 4. dispatch/object.h #define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, base)
扩展之后的结果为:
@interface OS_dispatch_queue_serial : OS_dispatch_queue - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end typedef OS_dispatch_queue_searial *dispatch_queue_searial_t;
从扩展结果看,OS_dispatch_queue_serial
继承自OS_dispatch_queue
。
OS_dispatch_queue_serial
的实现位于 src/object.m 中:
// 1. src/object.m DISPATCH_CLASS_IMPL(queue_serial) // 2. src/object.m #define DISPATCH_CLASS_IMPL(name) \ EMPTY_OS_OBJECT_CLASS_IMPL(DISPATCH_CLASS(name)) // 3. src/object.m #define EMPTY_OS_OBJECT_CLASS_IMPL(name) \ OS_OBJECT_NONLAZY_CLASS \ @implementation name \ OS_OBJECT_NONLAZY_CLASS_LOAD \ DISPATCH_UNAVAILABLE_INIT() \ @end // 4. src/object_internal.h #define DISPATCH_UNAVAILABLE_INIT() \ - (instancetype)init { \ DISPATCH_CLIENT_CRASH(0, "-init called directly"); \ return [super init]; \ }
扩展之后的结果为:
@implementation OS_dispatch_queue_serial - (instancetype)init { return [super init]; } @end
5 OS_dispatch_queue_concurrent
OS_dispatch_queque_concurrent
由宏DISPATCH_DECL_SUBCLASS_SWIFT
扩展而来:
// 1. dispatch/queue.h DISPATCH_DECL_SUBCLASS_SWIFT(dispatch_queue_concurrent, dispatch_queue, DispatchConcurrentQueue);
扩展结果为:
@interface OS_dispatch_queue_concurrent : OS_dispatch_queue - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end typedef OS_dispatch_queue_concurrent *dispatch_queue_concurrent_t;
从扩展结果看,OS_dispatch_queue_concurrent
继承自OS_dispatch_queue
。
OS_dispatch_queue_concurrent
的实现位于 src/object.m 中:
DISPATCH_CLASS_IMPL(queue_concurrent)
扩展之后的结果为:
@implementation OS_dispatch_queue_concurrent - (instancetype)init { return [super init]; } @end
5 OS_dispatch_queue_main
OS_dispatch_queue_main
由宏DISPATCH_DECL_SUBCLASS
扩展而来:
// 1. dispatch/queue.h DISPATCH_DECL_SUBCLASS(dispatch_queue_main, dispatch_queue_serial);
扩展的结果为:
@interface OS_dispatch_queue_main : OS_dispatch_queue_serial - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end typedef OS_dispatch_queue_main *dispatch_queue_main_t;
从扩展结果看,OS_dispatch_queue_main
继承自OS_dispatch_queue_serial
。
OS_dispatch_queue_main
的实现部分位于 src/object.m 中:
// 1. src/object.m DISPATCH_CLASS_IMPL(queue_main)
扩展之后的结果为:
@implementation OS_dispatch_queue_main - (instancetype)init { return [super init]; } @end
6 OS_dispatch_queue_global
OS_disaptch_queue_global
由宏DISPATCH_DECL_SUBCLASS
扩展而来:
// 1. dispatch/queue.h DISPATCH_DECL_SUBCLASS(dispatch_queue_global, dispatch_queue);
扩展之后的结果为:
@interface OS_dispatch_queue_global : OS_dispatch_queue - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end typedef OS_dispatch_queue_global *dispatch_queue_global_t;
从扩展结果看,OS_dispatch_queue_global
继承自OS_dispatch_queue
。
OS_dispatch_queue_global
的实现位于 src/object.m 中:
// 1. src/object.m DISPATCH_CLASS_IMPL(queue_global)
扩展结果之后为:
@implementation OS_dispatch_queue_global - (instancetype)init { return [super init]; } @end
2 OC 协议
2.1 <OS_object>
<OS_object>
由宏OS_OBJECT_DECL_PROTOCOL
定义:
// 1. os/object_private.h OS_OBJECT_DECL_PROTOCOL(object, <NSObject>); // 2. os/object.h #define OS_OBJECT_DECL_PROTOCOL(name, ...) \ @protocol OS_OBJECT_CLASS(name) __VA_ARGS__ \ @end
宏扩展的结果为:
@protocol OS_object <NSObject> @end
从扩展结果可以知道,<OS_object>
继承自<NSObject>
。
2.2 <OS_dispatch_object>
<OS_dispatch_object>
由宏_OS_OBJECT_DECL_PROTOCOL
定义:
// 1. src/object_internal.h _OS_OBJECT_DECL_PROTOCOL(dispatch_object, object); // 2. os/object_private.h #define _OS_OBJECT_DECL_PROTOCOL(name, super) \ OS_OBJECT_DECL_PROTOCOL(name, <OS_OBJECT_CLASS(super)>)
宏扩展之后的结果为:
@protocol OS_dispatch_object <OS_object> @end
从扩展结果可以看出,<OS_dispatch_object>
继承自<OS_object>
。
2.3 <OS_dispatch_queue>
<OS_dispatch_queue>
由宏DISPATCH_CLASS_DECL
定义:
// 1. src/queue_internal.h DISPATCH_CLASS_DECL(queue, QUEUE); // 2. src/object_internal.h #define DISPATCH_CLASS_DECL(name, cluster) \ _OS_OBJECT_DECL_PROTOCOL(dispatch_##name, dispatch_object) \ _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(dispatch_##name, dispatch_##name) \ DISPATCH_CLASS_DECL_BARE(name, cluster)
宏DISPATCH_CLASS_DECL
有 3 个宏构成,其中宏DISPATCH_CLASS_DECL_BARE
后面再说。
宏_OS_OBJECT_DECL_PROTOCOL
扩展之后的结果为:
@protocol OS_dispatch_queue <OS_dispatch_object> @end
从扩展结果看,<OS_dispatch_queue>
继承自<OS_dispatch_object>
。
宏_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL
的定义如下:
// 1. os/object_private.h #define _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, super) \ OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, super) // 2. os/object.h #define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, proto) \ OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL( \ OS_OBJECT_CLASS(name), OS_OBJECT_CLASS(proto)) // 3. os/object.h #define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL(name, proto) \ @interface name () <proto> \ @end
宏的扩展结果为:
@interface OS_dispatch_queue () <OS_dispatch_queue> @end
从扩展结果可知,OS_dispatch_queue
实现了同名协议<OS_dispatch_queue>
。
2.4 <OS_dispatch_queue_serial>
<OS_dispatch_queue_serial>
由宏DISPATCH_SUBCLASS_DECL
定义:
// 1. src/queue_internal.h DISPATCH_SUBCLASS_DECL(queue_serial, queue_serial_executor, lane); // 2. src/object_internal.h #define DISPATCH_SUBCLASS_DECL(name, super, ctype) \ _OS_OBJECT_DECL_PROTOCOL(dispatch_##name, dispatch_##super); \ _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(dispatch_##name, dispatch_##name) \ OS_OBJECT_SUBCLASS_DECL(dispatch_##name, dispatch_##ctype)
宏DISPATCH_SUBCLASS_DECL
由 3 个宏构成,其中宏OS_OBJECT_SUBCLASS_DECL
后面再说。
宏_OS_OBJECT_DECL_PROTOCOL
_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL
扩展的结果为:
@protocol OS_dispatch_queue_serial <OS_dispatch_queue_serial_executor> @end @interface OS_dispatch_queue_serial () <OS_dispatch_queue_serial> @end
从扩展结果可以知道,<OS_dispatch_queue_serial>
继承自<OS_dispatch_queue_serial_executor>
。同时,OS_dispatch_queue_serial
实现了同名协议<OS_dispatch_queue_serial>
。
协议<OS_dispatch_queue_serial_executor>
是 GCD 内部的一个协议,同样也有宏DISPATCH_SUBCLASS_DECL
定义:
// 1. src/queue_internal.h DISPATCH_SUBCLASS_DECL(queue_serial_executor, queue, lane);
因此,协议<OS_dispatch_queue_serial_executor>继承自
<OS_dispatch_queue>`。
2.5 <OS_dispatch_queue_concurrent>
<OS_dispatch_queue_concurrent>
由宏DISPATCH_SUBCLASS_DECL
定义:
// 1. src/queue_internal.h DISPATCH_SUBCLASS_DECL(queue_concurrent, queue, lane);
宏扩展的结果为:
@protocol OS_dispatch_queue_concurrent <OS_dispatch_queue> @end @interface OS_dispatch_queue_concurrent () <OS_dispatch_queue_concurrent> @end
从扩展结果可以知道,<OS_dispatch_queue_concurrent>
继承自<OS_dispatch_queue>
。同时,OS_dispatch_queue_concurrent
实现了同名的<OS_dispatch_queue_concurrent>
。
2.6 <OS_dispatch_queue_main>
OS_dispatch_queue_main
由宏DISPATCH_SUBCLASS_DECL
定义:
// 1. src/queue_internal.h DISPATCH_SUBCLASS_DECL(queue_main, queue_serial, lane);
宏扩展结果为:
@protocol OS_dispatch_queue_main <OS_dispatch_queue_serial> @end @interface OS_dispatch_queue_main () <OS_dispatch_queue_main> @end
从扩展结果可以知道,<OS_dispatch_queue_main>
继承自<OS_dispatch_queue_serial>
。同时,OS_dispatch_queue_main
实现了同名的<OS_dispatch_queue_main>
。
2.7 <OS_dispatch_queue_global>
<OS_dispatch_queue_global>
由宏DISPATCH_SUBCLASS_DECL`定义:
// 1. src/queue_internal.h DISPATCH_SUBCLASS_DECL(queue_global, queue, lane);
宏扩展的结果为:
@protocol OS_disaptch_queue_global <OS_dispatch_queue> @end @interface OS_dispatch_queue_global () <OS_dispatch_queue_global> @end
从扩展结果可以知道,<OS_dispatch_queue_global>
继承自<OS_dispatch_queue>
。同时,OS_dispatch_queue_global
实现了同名协议<OS_dispatch_queue_global>
。
3 Struct
3.1 _os_object_s 与 _os_object_vtable_s
_os_object_s
定义如下:
// 1. src/object_internal.h typedef struct _os_object_s { _OS_OBJECT_HEADER( const _os_object_vtable_s *__ptrauth_objc_isa_pointer os_obj_isa, os_obj_ref_cnt, os_obj_xref_cnt); } _os_object_s;
宏_OS_OBJECT_HEADER
定义如下:
// 1. os/object_private.h #define _OS_OBJECT_HEADER(isa, ref_cnt, xref_cnt) \ isa; /* must be pointer-sized and use __ptrauth_objc_isa_pointer */ \ int volatile ref_cnt; \ int volatile xref_cnt
因此,_os_object_s
完整的定义如下:
typedef struct _os_object_s { const _os_object_vtable_s *__ptrauth_objc_isa_pointer os_obj_isa, int volatile os_obj_ref_cnt; int volatile os_obj_xref_cnt; } _os_object_s;
_os_object_vtable_s
的定义如下:
// 1. src/object_internal.h typedef struct _os_object_vtable_s { _OS_OBJECT_CLASS_HEADER(); } _os_object_vtable_s;
宏_OS_OBJECT_CLASS_HEADER
定义如下:
// 1. os/object_private.h // Must match size of compiler-generated OBJC_CLASS structure rdar://10640168 #define _OS_OBJECT_CLASS_HEADER() \ void *_os_obj_objc_class_t[5]
因此,_os_object_vtalbe_s
的完整定义为:
typedef struct _os_object_vtable_s { void *_os_obj_objc_class_t[5]; } _os_object_vtable_s;
3.2 dispatch_object_s 与 dispatch_object_vtable_s
dispatch_object_s
定义如下:
// 1. src/object_internal.h struct dispatch_object_s { _DISPATCH_OBJECT_HEADER(object); };
宏_DISPATCH_OBJECT_HEADER
的定义如下:
// 1. src/object_internal.h #define _DISPATCH_OBJECT_HEADER(x) \ _DISPATCH_OBJECT_HEADER_INTERNAL(x) \ struct dispatch_queue_s *do_targetq; \ void *do_ctxt; \ union { \ dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer; \ void *do_introspection_ctxt; \ } // 2. src/object_internal.h #define _DISPATCH_OBJECT_HEADER(x) \ _DISPATCH_OBJECT_HEADER_INTERNAL(x) \ struct dispatch_queue_s *do_targetq; \ void *do_ctxt; \ union { \ dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer; \ void *do_introspection_ctxt; \ } // 3. src/object_internal.h #define _DISPATCH_OBJECT_HEADER_INTERNAL(x) \ struct _os_object_s _as_os_obj[0]; \ OS_OBJECT_STRUCT_HEADER(dispatch_##x); \ struct dispatch_##x##_s *volatile do_next; // 4. src/object_internal.h #define OS_OBJECT_STRUCT_HEADER(x) \ _OS_OBJECT_HEADER(\ const struct x##_vtable_s *__ptrauth_objc_isa_pointer do_vtable, \ do_ref_cnt, \ do_xref_cnt)
因此,dispatch_object_s
展开的完整结果为:
struct dispatch_object_s { // 这里就是 _os_object_s 内容 const struct dispatch_object_vtable_s *__ptrauth_objc_isa_pointer do_vtable, int volatile do_ref_cnt; int volatile do_xref_cnt; struct dispatch_object_s *volatile do_next; struct dispatch_queue_s *do_targetq; void *do_ctx; union { dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer; void *do_introspection_ctxt; } };
从展开的结果可以看到,dispatch_object_s
的头部区域就是_os_object_s
的内容,可以认为,dispatch_object_s
"继承"自_os_object_s
。
dispatch_object_vtable_s
由宏DISPATCH_CLASS_DECL_BARE
定义:
// 1. src/object_internal.h DISPATCH_CLASS_DECL_BARE(object, OBJECT);
DISPATCH_CLASS_DECL_BARE
正是组成DISPATCH_CLASS_DECL
的第 3 个宏。
DISPATCH_CLASS_DECL_BARE
的定义如下:
// 1. src/object_internal.h #define DISPATCH_CLASS_DECL_BARE(name, cluster) \ OS_OBJECT_CLASS_DECL(dispatch_##name, \ DISPATCH_##cluster##_VTABLE_HEADER(dispatch_##name))
因此,宏DISPATCH_CLASS_DECL_BARE(name, OBJECT)
扩展为:
OS_OBJECT_CLASS_DECL(dispatch_object, DISPATCH_OBJECT_VTALBE_HEADER(dispatch_object))
宏DISPATCH_OBJECT_VTABLE_HEADER
的定义如下:
// 1. src/object_internal.h #define DISPATCH_OBJECT_VTABLE_HEADER(x) \ unsigned long const do_type; \ void DISPATCH_VTABLE_ENTRY(do_dispose)(struct x##_s *, \ bool *allow_free); \ size_t DISPATCH_VTABLE_ENTRY(do_debug)(struct x##_s *, \ char *, size_t); \ void DISPATCH_VTABLE_ENTRY(do_invoke)(struct x##_s *, \ dispatch_invoke_context_t, dispatch_invoke_flags_t) // 2. src/internal.h #define DISPATCH_VTABLE_ENTRY(op) \ (* __ptrauth(ptrauth_key_process_independent_code, true, \ ptrauth_string_discriminator("dispatch." #op)) const op)
宏DISPATCH_VTALBE_ENTRY
中的__ptrauth
与PAC
指针认证有关,与 GCD 功能无关,扩展结果中可以剔除这些扩展,因此宏DISPATCH_OBJECT_VTABLE_HEADER
的扩展结果为:
unsigned const do_type; void (* const do_dispose)(struct dispatch_object_s *, bool *allow_free); size_t (* const do_debug)(struct dispatch_object_s *, char *, size_t); void (* const do_invoke)(struct dispatch_object_s *, dispatch_invoke_context_t, dispatch_invoke_flags_t);
宏OS_OBJECT_CLASS_DECL
的定义如下:
// 1. src/object_internal.h #define OS_OBJECT_CLASS_DECL(name, ...) \ struct name##_s; \ struct name##_extra_vtable_s { \ __VA_ARGS__; \ }; \ struct name##_vtable_s { \ _OS_OBJECT_CLASS_HEADER(); \ struct name##_extra_vtable_s _os_obj_vtable; \ }; \ OS_OBJECT_EXTRA_VTABLE_DECL(name, name) \ extern const struct name##_vtable_s OS_OBJECT_CLASS_SYMBOL(name) \ __asm__(OS_OBJC_CLASS_RAW_SYMBOL_NAME(OS_OBJECT_CLASS(name))) // 2. os/object_private.h #define OS_OBJECT_CLASS_SYMBOL(name) OS_##name##_class // 3. os/object_private.h #define OS_OBJC_CLASS_RAW_SYMBOL_NAME(name) "_OBJC_CLASS_$_" OS_STRINGIFY(name)
上面代码中__VA_ARGS__
就是宏DISPATCH_OBJECT_VTABLE_HEADER(dispatch_object)
扩展的结果。因此宏DISPATCH_CLASS_DECL_BARE(object, OBJECT)
扩展之后的结果为:
struct dispatch_object_s; struct dispatch_object_extra_vtable_s { unsigned const do_type; void (* const do_dispose)(struct dispatch_object_s *, bool *allow_free); size_t (* const do_debug)(struct dispatch_object_s *, char *, size_t); void (* const do_invoke)(struct dispatch_object_s *, dispatch_invoke_context_t, dispatch_invoke_flags_t); }; struct dispatch_object_vtable_s { void *_os_obj_objc_class_t[5]; struct dispatch_object_extra_vtable_s _os_obj_vtable; }; extern const struct dispatch_object_vtable_s OS_dispatch_object_class __asm__("_OBJC_CLASS_$_OS_dispatch_object");
3.3 dispatch_queue_s 与 dispatch_queue_vtable_s
dispatch_queue_s
的定义如下:
// 1. src/queue_internal.h struct dispatch_queue_s { DISPATCH_QUEUE_CLASS_HEADER(queue, void *__dq_opaque1); /* 32bit hole on LP64 */ } DISPATCH_ATOMIC64_ALIGN; // 2. src/queue_internal.h #define DISPATCH_QUEUE_CLASS_HEADER(x, __pointer_sized_field__) \ _DISPATCH_QUEUE_CLASS_HEADER(x, __pointer_sized_field__); \ /* LP64 global queue cacheline boundary */ \ unsigned long dq_serialnum; \ const char *dq_label; \ DISPATCH_UNION_LE(uint32_t volatile dq_atomic_flags, \ const uint16_t dq_width, \ const uint16_t __dq_opaque2 \ ); \ dispatch_priority_t dq_priority; \ union { \ struct dispatch_queue_specific_head_s *dq_specific_head; \ struct dispatch_source_refs_s *ds_refs; \ struct dispatch_timer_source_refs_s *ds_timer_refs; \ struct dispatch_mach_recv_refs_s *dm_recv_refs; \ struct dispatch_channel_callbacks_s const *dch_callbacks; \ }; \ int volatile dq_sref_cnt // 3. src/queue_internal.h #define _DISPATCH_QUEUE_CLASS_HEADER(x, __pointer_sized_field__) \ DISPATCH_OBJECT_HEADER(x); \ __pointer_sized_field__; \ DISPATCH_UNION_LE(uint64_t volatile dq_state, \ dispatch_lock dq_state_lock, \ uint32_t dq_state_bits \ ) // 4. src/object_internal.h #define DISPATCH_OBJECT_HEADER(x) \ struct dispatch_object_s _as_do[0]; \ _DISPATCH_OBJECT_HEADER(x)
dispatch_queue_s
完整的扩展结果如下:
struct disaptch_queue_s { // 头部 dispatch_object_s 内容 const struct dispatch_queue_vtable_s *__ptrauth_objc_isa_pointer do_vtable, int volatile do_ref_cnt; int volatile do_xref_cnt; struct dispatch_queue_s *volatile do_next; struct dispatch_queue_s *do_targetq; void *do_ctx; union { dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer; void *do_introspection_ctxt; }; void *__dq_opaque1; union { uint64_t volatile dq_state; struct { dispatch_lock dq_state_lock; uint32_t dq_state_bits; }; }; /* LP64 global queue cacheline boundary */ unsigned long dq_serialnum; const char *dq_label; union { uint32_t volatile dq_atomic_flags; struct { const uint16_t dq_width; const uint16_t __dq_opaque2; }; }; dispatch_priority_t dq_priority; union { struct dispatch_queue_specific_head_s *dq_specific_head; struct dispatch_source_refs_s *ds_refs; struct dispatch_timer_source_refs_s *ds_timer_refs; struct dispatch_mach_recv_refs_s *dm_recv_refs; struct dispatch_channel_callbacks_s const *dch_callbacks; }; int volatile dq_sref_cnt }
disaptch_queue_vtable_s
由宏DISPATCH_CLASS_DECL
定义:
// 1. src/queue_internal.h DISPATCH_CLASS_DECL(queue, QUEUE); // 2. src/object_internal.h #define DISPATCH_CLASS_DECL(name, cluster) \ _OS_OBJECT_DECL_PROTOCOL(dispatch_##name, dispatch_object) \ _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(dispatch_##name, dispatch_##name) \ DISPATCH_CLASS_DECL_BARE(name, cluster)
具体的说,是构成DISPATCH_CLASS_DECL
宏的第 3 个宏DISPATCH_CLASS_BARE
定义了dispatch_queue_vtable_s
,完整的扩展结果为:
struct dispatch_queue_s; struct dispatch_queue_extra_vtable_s { unsigned long const do_type; void (* const do_dispose)(struct dispatch_queue_s *, bool *allow_free); size_t (* const do_debug)(struct dispatch_queue_s *, char *, size_t); void (* const do_invoke)(struct dispatch_queue_s *, dispatch_invoke_context_t, dispatch_qos_t); void (* const dq_activate)(dispatch_queue_class_t); void (* const dq_wakeup)(dispatch_queue_class_t, dispatch_qos_t, dispatch_wakeup_flags_t); void (* const dq_push)(dispatch_queue_class_t, dispatch_object_t, dispatch_qos_t); }; struct dispatch_queue_vtable_s { void *_os_obj_objc_class_t[5]; struct dispatch_queue_extra_vtable_s _os_obj_vtable; } extern const struct dispatch_queue_vtable_s OS_dispatch_queue_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue");
3.4 dispatch_lane_s 与 dispatch_lane_vtable_s
dispatch_lane_s
的定义如下:
// 1. src/queue_internal.h typedef struct dispatch_lane_s { DISPATCH_LANE_CLASS_HEADER(lane); /* 32bit hole on LP64 */ } DISPATCH_ATOMIC64_ALIGN *dispatch_lane_t; // 2. src/queue_internal.h #define DISPATCH_LANE_CLASS_HEADER(x) \ struct dispatch_queue_s _as_dq[0]; \ DISPATCH_QUEUE_CLASS_HEADER(x, \ struct dispatch_object_s *volatile dq_items_tail); \ dispatch_unfair_lock_s dq_sidelock; \ struct dispatch_object_s *volatile dq_items_head; \ uint32_t dq_side_suspend_cnt
扩展之后的完整结果为:
typedef struct dispatch_lane_s { // 这里是 dispatch_queue_s const struct dispatch_lane_vtable_s *__ptrauth_objc_isa_pointer do_vtable; int volatile do_ref_cnt; int volatile do_xref_cnt; struct dispatch_lane_s *volatile do_next; struct dispatch_queue_s *do_targetq; void *do_ctxt; union { dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer; void *do_introspection_ctxt; }; struct dispatch_object_s *volatile dq_items_tail; union { uint64_t volatile dq_state; struct { dispatch_lock dq_state_lock; uint32_t dq_state_bits; }; ); /* LP64 global queue cacheline boundary */ \ unsigned long dq_serialnum; \ const char *dq_label; \ union { uint32_t volatile dq_atomic_flags; struct { const uint16_t dq_width; const uint16_t __dq_opaque2; }; ); dispatch_priority_t dq_priority; union { struct dispatch_queue_specific_head_s *dq_specific_head; struct dispatch_source_refs_s *ds_refs; struct dispatch_timer_source_refs_s *ds_timer_refs; struct dispatch_mach_recv_refs_s *dm_recv_refs; struct dispatch_channel_callbacks_s const *dch_callbacks; }; int volatile dq_sref_cnt; dispatch_unfair_lock_s dq_sidelock; struct dispatch_object_s *volatile dq_items_head; uint32_t dq_side_suspend_cnt; } *dispatch_lane_t;
dispatch_lane_vtable_s
由宏DISPATCH_CLASS_DECL_BARE
定义:
// 1. src/queue_internal.h DISPATCH_CLASS_DECL_BARE(lane, QUEUE);
dispatch_lane_vtable_s
由宏OS_OBJECT_SUBCLASS_DECL
定义,完整的展开结果为:
struct dispatch_lane_s; struct dispatch_lane_extra_vtable_s { unsigned long const do_type; void (* const do_dispose)(struct dispatch_lane_s * bool *allow_free); size_t (* const do_debug)(struct dispatch_lane_s *, char *, size_t); void (* const do_invoke)(struct dispatch_lane_s * dispatch_invoke_context_t, dispatch_invoke_flags_t); void (* const dq_activate)(dispatch_queue_class_t); void (* const dq_wakeup)(dispatch_queue_class_t, dispatch_qos_t, dispatch_wakeup_flags_t); void (* const dq_push)(dispatch_queue_class_t, dispatch_object_t, dispatch_qos_t); } struct dispatch_lane_vtable_s { void *_os_obj_objc_class_t[5]; struct dispatch_lane_extra_vtable_s _os_obj_vtable; } extern const struct dispatch_lane_vtable_s OS_dispatch_lane_class __asm__("_OBJC_CLASS_$_OS_dispatch_lane")
与dispatch_lane_vtable_s
有关的 3 个宏定义如下:
// 1. src/queue_internal.h DISPATCH_SUBCLASS_DECL(queue_serial, queue_serial_executor, lane); DISPATCH_SUBCLASS_DECL(queue_main, queue_serial, lane); DISPATCH_SUBCLASS_DECL(queue_concurrent, queue, lane); DISPATCH_SUBCLASS_DECL(queue_global, queue, lane); // 2. src/object_internal.h #define DISPATCH_SUBCLASS_DECL(name, super, ctype) \ _OS_OBJECT_DECL_PROTOCOL(dispatch_##name, dispatch_##super); \ _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(dispatch_##name, dispatch_##name) \ OS_OBJECT_SUBCLASS_DECL(dispatch_##name, dispatch_##ctype) // 3. src/object_internal.h // define a new subclass used in a cluster #define OS_OBJECT_SUBCLASS_DECL(name, ctype) \ struct name##_s; \ OS_OBJECT_EXTRA_VTABLE_DECL(name, ctype) \ extern const struct ctype##_vtable_s OS_OBJECT_CLASS_SYMBOL(name) \ __asm__(OS_OBJC_CLASS_RAW_SYMBOL_NAME(OS_OBJECT_CLASS(name)))
之前在第 2 部分没有介绍宏OS_OBJECT_SUBCLASS_DECL
,这里继续介绍。
代码注释 1 处 4 个宏展开之后的结果为:
struct dispatch_queue_serial_s; extern const struct dispatch_lane_vtable_s OS_dispatch_queue_serial_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue_serial"); struct dispatch_queue_main_s; extern const struct dispatch_lane_vtable_s OS_dispatch_queue_main_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue_main"); struct dispatch_queue_concurrent_s; extern const struct dispatch_lane_vtable_s OS_dispatch_queue_concurrent_class __asm__("_OBJC_CLASS_$_OS_dispatch_concurrent"); struct dispatch_queue_global_s; extern const struct dispatch_lane_vtable_s OS_dispatch_queue_global_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue_global");
3.6 dispatch_queue_global_s
dispatch_queue_global_s
定义如下:
// 1. src/queue_internal.h struct dispatch_queue_global_s { DISPATCH_QUEUE_ROOT_CLASS_HEADER(lane); } DISPATCH_CACHELINE_ALIGN; // 2. src/queue_internal.h #define DISPATCH_QUEUE_ROOT_CLASS_HEADER(x) \ struct dispatch_queue_s _as_dq[0]; \ DISPATCH_QUEUE_CLASS_HEADER(x, \ struct dispatch_object_s *volatile dq_items_tail); \ int volatile dgq_thread_pool_size; \ struct dispatch_object_s *volatile dq_items_head; \ int volatile dgq_pending;
完整扩展结果如下:
typedef struct dispatch_queue_global_s { // 这里是 dispatch_queue_s const struct dispatch_lane_vtable_s *__ptrauth_objc_isa_pointer do_vtable; int volatile do_ref_cnt; int volatile do_xref_cnt; struct dispatch_lane_s *volatile do_next; struct dispatch_queue_s *do_targetq; void *do_ctxt; union { dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer; void *do_introspection_ctxt; }; struct dispatch_object_s *volatile dq_items_tail; union { uint64_t volatile dq_state; struct { dispatch_lock dq_state_lock; uint32_t dq_state_bits; }; ); /* LP64 global queue cacheline boundary */ \ unsigned long dq_serialnum; \ const char *dq_label; \ union { uint32_t volatile dq_atomic_flags; struct { const uint16_t dq_width; const uint16_t __dq_opaque2; }; ); dispatch_priority_t dq_priority; union { struct dispatch_queue_specific_head_s *dq_specific_head; struct dispatch_source_refs_s *ds_refs; struct dispatch_timer_source_refs_s *ds_timer_refs; struct dispatch_mach_recv_refs_s *dm_recv_refs; struct dispatch_channel_callbacks_s const *dch_callbacks; }; int volatile dq_sref_cnt; int volatile dgq_thread_pool_size; struct dispatch_object_s *volatile dq_items_head; int volatile dgq_pending; }
3.7 dispatch_queue_class_t
dispatch_queue_class_t
的定义如下:
// 1. src/internal.h // Dispatch queue cluster class: type for any dispatch_queue_t typedef union { struct dispatch_queue_s *_dq; struct dispatch_workloop_s *_dwl; struct dispatch_lane_s *_dl; struct dispatch_queue_static_s *_dsq; struct dispatch_queue_global_s *_dgq; struct dispatch_queue_pthread_root_s *_dpq; struct dispatch_source_s *_ds; struct dispatch_channel_s *_dch; struct dispatch_mach_s *_dm; dispatch_lane_class_t _dlu; #ifdef __OBJC__ id<OS_dispatch_queue> _objc_dq; #endif } dispatch_queue_class_t DISPATCH_TRANSPARENT_UNION;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2013-11-13 java中的native关键字