经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
GCD Inside: GCD 数据结构
来源:cnblogs  作者:chaoguo1234  时间:2023/11/13 8:45:11  对本文有异议

1 OS_object

OS_object由下面宏OS_OBJECT_DEC_BASE扩展而来:

  1. // 1. os/object.h
  2. OS_OBJECT_DECL_BASE(object, NSObject);
  3. // 2. os/object.h
  4. #define OS_OBJECT_DECL_BASE(name, ...) @interface OS_OBJECT_CLASS(name) : __VA_ARGS__ - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); @end

扩展之后的结果为:

  1. @interface OS_object : NSObject
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end

从扩展的结果来看,OS_object继承自NSObject

OS_object实现部分位于 src/object.m 中:

  1. @implementation OS_OBJECT_CLASS(object)
  2. DISPATCH_UNAVAILABLE_INIT()
  3. -(id)retain {
  4. return _os_object_retain(self);
  5. }
  6. -(oneway void)release {
  7. return _os_object_release_without_xref_dispose(self);
  8. }
  9. -(NSUInteger)retainCount {
  10. return _os_object_retain_count(self);
  11. }
  12. #pragma clang diagnostic push
  13. #pragma clang diagnostic ignored "-Wdeprecated-implementations"
  14. -(BOOL)retainWeakReference {
  15. return _os_object_retain_weak(self);
  16. }
  17. -(BOOL)allowsWeakReference {
  18. return _os_object_allows_weak_reference(self);
  19. }
  20. #pragma clang diagnostic pop
  21. - (void)_xref_dispose {
  22. return _os_object_release_internal(self);
  23. }
  24. @end

OS_OBJECT_CLASS的作用就是给宏参数加一个OS_前缀,因此OS_OBJECT_CLASS(object)扩展之后就是OS_object

GCD 源码为OS_object定义了一个指针类型:

  1. // 1. os/object_private.h
  2. typedef OS_OBJECT_CLASS(object) *_os_object_t;

上面代码中将宏扩展开,就是做了如下定义:

  1. typdef OS_object *_os_object_t;

2 OS_dispatch_object

OS_dispatch_object由宏OS_OBJECT_DECL_CLASS扩展而来:

  1. // 1. dispatch/object.h
  2. OS_OBJECT_DECL_CLASS(dispatch_object);
  3. // 2. os/object.h
  4. #define OS_OBJECT_DECL_CLASS(name) OS_OBJECT_DECL_SUBCLASS_SWIFT(name, object)
  5. // 3. os/object.h
  6. #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))
  7. // 4. os/object.h
  8. #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

扩展之后的结果为:

  1. @interface OS_dispatch_object : OS_object
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end
  4. 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扩展之后就是:

  1. __attribute__((objc_runtime_visible))

OS_dispatch_object的实现位于 src/object.m 中:

  1. @implementation DISPATCH_CLASS(object)
  2. DISPATCH_UNAVAILABLE_INIT()
  3. - (NSString *)debugDescription {
  4. Class nsstring = objc_lookUpClass("NSString");
  5. if (!nsstring) return nil;
  6. char buf[2048];
  7. struct dispatch_object_s *obj = (struct dispatch_object_s *)self;
  8. if (dx_vtable(obj)->do_debug) {
  9. dx_debug(obj, buf, sizeof(buf));
  10. } else {
  11. strlcpy(buf, object_getClassName(self), sizeof(buf));
  12. }
  13. NSString *format = [nsstring stringWithUTF8String:"<%s: %s>"];
  14. if (!format) return nil;
  15. return [nsstring stringWithFormat:format, object_getClassName(self), buf];
  16. }
  17. #pragma clang diagnostic push
  18. #pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
  19. - (void)dealloc {
  20. return _dispatch_dispose(self);
  21. }
  22. #pragma clang diagnostic pop
  23. @end

DISPATCH_CLASS的作用是在宏参数前面加上前缀OS_dispatch_,因此DISPATCH_CLASS(object)扩展之后就是OS_dispatch_object

3 OS_dispatch_queue

OS_dispatch_queue由宏DISPATCH_DECL_FACTORY_CLASS_SWIFT扩展而来:

  1. // 1. dispatch/queue.h
  2. DISPATCH_DECL_FACTORY_CLASS_SWIFT(dispatch_queue, DispatchQueue);
  3. // 2. dispatch/object.h
  4. #define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) OS_OBJECT_SWIFT_HAS_MISSING_DESIGNATED_INIT DISPATCH_DECL_SWIFT(name, swift_name)
  5. // 3. dispatch/object.h
  6. #define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL(name)
  7. // 4. dispatch/object.h
  8. #define DISPATCH_DECL(name) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, dispatch_object)
  9. // 5. os/object.h
  10. #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))

扩展之后的结果为:

  1. @interface OS_dispatch_queue : OS_dispatch_object
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end
  4. typedef OS_dispatch_queue *dispatch_queue_t;

从扩展结果看OS_dispatch_queue继承自OS_dispatch_object

OS_dispatch_queue的实现部分位于 src/object.m 中:

  1. @implementation DISPATCH_CLASS(queue)
  2. OS_OBJECT_NONLAZY_CLASS_LOAD
  3. DISPATCH_UNAVAILABLE_INIT()
  4. DISPATCH_OBJECT_USES_XREF_DISPOSE()
  5. - (NSString *)description {
  6. Class nsstring = objc_lookUpClass("NSString");
  7. if (!nsstring) return nil;
  8. NSString *format = [nsstring stringWithUTF8String:"<%s: %s>"];
  9. if (!format) return nil;
  10. return [nsstring stringWithFormat:format, object_getClassName(self),
  11. dispatch_queue_get_label(self), self];
  12. }
  13. - (void)_xref_dispose {
  14. _dispatch_queue_xref_dispose((struct dispatch_queue_s *)self);
  15. [super _xref_dispose];
  16. }
  17. @end

DISPATCH_CLASS(queue)扩展之后就是OS_dispatch_queue

4 OS_dispatch_queue_serial

OS_dispatch_queue_serial由宏DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT扩展而来:

  1. // 1. dispatch/queue.h
  2. DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(dispatch_queue_serial, DispatchSerialQueue);
  3. // 2. dispatch/object.h
  4. #define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name)
  5. // 3. dispatch/object.h
  6. #define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL_SUBCLASS(name, base)
  7. // 4. dispatch/object.h
  8. #define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, base)

扩展之后的结果为:

  1. @interface OS_dispatch_queue_serial : OS_dispatch_queue
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end
  4. typedef OS_dispatch_queue_searial *dispatch_queue_searial_t;

从扩展结果看,OS_dispatch_queue_serial继承自OS_dispatch_queue

OS_dispatch_queue_serial的实现位于 src/object.m 中:

  1. // 1. src/object.m
  2. DISPATCH_CLASS_IMPL(queue_serial)
  3. // 2. src/object.m
  4. #define DISPATCH_CLASS_IMPL(name) EMPTY_OS_OBJECT_CLASS_IMPL(DISPATCH_CLASS(name))
  5. // 3. src/object.m
  6. #define EMPTY_OS_OBJECT_CLASS_IMPL(name) OS_OBJECT_NONLAZY_CLASS @implementation name OS_OBJECT_NONLAZY_CLASS_LOAD DISPATCH_UNAVAILABLE_INIT() @end
  7. // 4. src/object_internal.h
  8. #define DISPATCH_UNAVAILABLE_INIT() - (instancetype)init { DISPATCH_CLIENT_CRASH(0, "-init called directly"); return [super init]; }

扩展之后的结果为:

  1. @implementation OS_dispatch_queue_serial
  2. - (instancetype)init {
  3. return [super init];
  4. }
  5. @end

5 OS_dispatch_queue_concurrent
OS_dispatch_queque_concurrent由宏DISPATCH_DECL_SUBCLASS_SWIFT扩展而来:

  1. // 1. dispatch/queue.h
  2. DISPATCH_DECL_SUBCLASS_SWIFT(dispatch_queue_concurrent, dispatch_queue, DispatchConcurrentQueue);

扩展结果为:

  1. @interface OS_dispatch_queue_concurrent : OS_dispatch_queue
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end
  4. typedef OS_dispatch_queue_concurrent *dispatch_queue_concurrent_t;

从扩展结果看,OS_dispatch_queue_concurrent继承自OS_dispatch_queue

OS_dispatch_queue_concurrent的实现位于 src/object.m 中:

  1. DISPATCH_CLASS_IMPL(queue_concurrent)

扩展之后的结果为:

  1. @implementation OS_dispatch_queue_concurrent
  2. - (instancetype)init {
  3. return [super init];
  4. }
  5. @end

5 OS_dispatch_queue_main

OS_dispatch_queue_main由宏DISPATCH_DECL_SUBCLASS扩展而来:

  1. // 1. dispatch/queue.h
  2. DISPATCH_DECL_SUBCLASS(dispatch_queue_main, dispatch_queue_serial);

扩展的结果为:

  1. @interface OS_dispatch_queue_main : OS_dispatch_queue_serial
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end
  4. 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. // 1. src/object.m
  2. DISPATCH_CLASS_IMPL(queue_main)

扩展之后的结果为:

  1. @implementation OS_dispatch_queue_main
  2. - (instancetype)init {
  3. return [super init];
  4. }
  5. @end

6 OS_dispatch_queue_global

OS_disaptch_queue_global由宏DISPATCH_DECL_SUBCLASS扩展而来:

  1. // 1. dispatch/queue.h
  2. DISPATCH_DECL_SUBCLASS(dispatch_queue_global, dispatch_queue);

扩展之后的结果为:

  1. @interface OS_dispatch_queue_global : OS_dispatch_queue
  2. - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
  3. @end
  4. typedef OS_dispatch_queue_global *dispatch_queue_global_t;

从扩展结果看,OS_dispatch_queue_global继承自OS_dispatch_queue

OS_dispatch_queue_global的实现位于 src/object.m 中:

  1. // 1. src/object.m
  2. DISPATCH_CLASS_IMPL(queue_global)

扩展结果之后为:

  1. @implementation OS_dispatch_queue_global
  2. - (instancetype)init {
  3. return [super init];
  4. }
  5. @end

2 OC 协议

2.1 <OS_object>

<OS_object>由宏OS_OBJECT_DECL_PROTOCOL定义:

  1. // 1. os/object_private.h
  2. OS_OBJECT_DECL_PROTOCOL(object, <NSObject>);
  3. // 2. os/object.h
  4. #define OS_OBJECT_DECL_PROTOCOL(name, ...) @protocol OS_OBJECT_CLASS(name) __VA_ARGS__ @end

宏扩展的结果为:

  1. @protocol OS_object <NSObject>
  2. @end

从扩展结果可以知道,<OS_object>继承自<NSObject>

2.2 <OS_dispatch_object>

<OS_dispatch_object>由宏_OS_OBJECT_DECL_PROTOCOL定义:

  1. // 1. src/object_internal.h
  2. _OS_OBJECT_DECL_PROTOCOL(dispatch_object, object);
  3. // 2. os/object_private.h
  4. #define _OS_OBJECT_DECL_PROTOCOL(name, super) OS_OBJECT_DECL_PROTOCOL(name, <OS_OBJECT_CLASS(super)>)

宏扩展之后的结果为:

  1. @protocol OS_dispatch_object <OS_object>
  2. @end

从扩展结果可以看出,<OS_dispatch_object>继承自<OS_object>

2.3 <OS_dispatch_queue>

<OS_dispatch_queue>由宏DISPATCH_CLASS_DECL定义:

  1. // 1. src/queue_internal.h
  2. DISPATCH_CLASS_DECL(queue, QUEUE);
  3. // 2. src/object_internal.h
  4. #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扩展之后的结果为:

  1. @protocol OS_dispatch_queue <OS_dispatch_object>
  2. @end

从扩展结果看,<OS_dispatch_queue>继承自<OS_dispatch_object>

_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL的定义如下:

  1. // 1. os/object_private.h
  2. #define _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, super) OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, super)
  3. // 2. os/object.h
  4. #define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, proto) OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL( OS_OBJECT_CLASS(name), OS_OBJECT_CLASS(proto))
  5. // 3. os/object.h
  6. #define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL(name, proto) @interface name () <proto> @end

宏的扩展结果为:

  1. @interface OS_dispatch_queue () <OS_dispatch_queue>
  2. @end

从扩展结果可知,OS_dispatch_queue实现了同名协议<OS_dispatch_queue>

2.4 <OS_dispatch_queue_serial>

<OS_dispatch_queue_serial>由宏DISPATCH_SUBCLASS_DECL定义:

  1. // 1. src/queue_internal.h
  2. DISPATCH_SUBCLASS_DECL(queue_serial, queue_serial_executor, lane);
  3. // 2. src/object_internal.h
  4. #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扩展的结果为:

  1. @protocol OS_dispatch_queue_serial <OS_dispatch_queue_serial_executor>
  2. @end
  3. @interface OS_dispatch_queue_serial () <OS_dispatch_queue_serial>
  4. @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. // 1. src/queue_internal.h
  2. 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. // 1. src/queue_internal.h
  2. DISPATCH_SUBCLASS_DECL(queue_concurrent, queue, lane);

宏扩展的结果为:

  1. @protocol OS_dispatch_queue_concurrent <OS_dispatch_queue>
  2. @end
  3. @interface OS_dispatch_queue_concurrent () <OS_dispatch_queue_concurrent>
  4. @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. // 1. src/queue_internal.h
  2. DISPATCH_SUBCLASS_DECL(queue_main, queue_serial, lane);

宏扩展结果为:

  1. @protocol OS_dispatch_queue_main <OS_dispatch_queue_serial>
  2. @end
  3. @interface OS_dispatch_queue_main () <OS_dispatch_queue_main>
  4. @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. // 1. src/queue_internal.h
  2. DISPATCH_SUBCLASS_DECL(queue_global, queue, lane);

宏扩展的结果为:

  1. @protocol OS_disaptch_queue_global <OS_dispatch_queue>
  2. @end
  3. @interface OS_dispatch_queue_global () <OS_dispatch_queue_global>
  4. @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. // 1. src/object_internal.h
  2. typedef struct _os_object_s {
  3. _OS_OBJECT_HEADER(
  4. const _os_object_vtable_s *__ptrauth_objc_isa_pointer os_obj_isa,
  5. os_obj_ref_cnt,
  6. os_obj_xref_cnt);
  7. } _os_object_s;

_OS_OBJECT_HEADER定义如下:

  1. // 1. os/object_private.h
  2. #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完整的定义如下:

  1. typedef struct _os_object_s {
  2. const _os_object_vtable_s *__ptrauth_objc_isa_pointer os_obj_isa,
  3. int volatile os_obj_ref_cnt;
  4. int volatile os_obj_xref_cnt;
  5. } _os_object_s;

_os_object_vtable_s的定义如下:

  1. // 1. src/object_internal.h
  2. typedef struct _os_object_vtable_s {
  3. _OS_OBJECT_CLASS_HEADER();
  4. } _os_object_vtable_s;

_OS_OBJECT_CLASS_HEADER定义如下:

  1. // 1. os/object_private.h
  2. // Must match size of compiler-generated OBJC_CLASS structure rdar://10640168
  3. #define _OS_OBJECT_CLASS_HEADER() void *_os_obj_objc_class_t[5]

因此,_os_object_vtalbe_s的完整定义为:

  1. typedef struct _os_object_vtable_s {
  2. void *_os_obj_objc_class_t[5];
  3. } _os_object_vtable_s;

3.2 dispatch_object_s 与 dispatch_object_vtable_s

dispatch_object_s定义如下:

  1. // 1. src/object_internal.h
  2. struct dispatch_object_s {
  3. _DISPATCH_OBJECT_HEADER(object);
  4. };

_DISPATCH_OBJECT_HEADER的定义如下:

  1. // 1. src/object_internal.h
  2. #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. // 2. src/object_internal.h
  4. #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; }
  5. // 3. src/object_internal.h
  6. #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;
  7. // 4. src/object_internal.h
  8. #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展开的完整结果为:

  1. struct dispatch_object_s {
  2. // 这里就是 _os_object_s 内容
  3. const struct dispatch_object_vtable_s *__ptrauth_objc_isa_pointer do_vtable,
  4. int volatile do_ref_cnt;
  5. int volatile do_xref_cnt;
  6. struct dispatch_object_s *volatile do_next;
  7. struct dispatch_queue_s *do_targetq;
  8. void *do_ctx;
  9. union {
  10. dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer;
  11. void *do_introspection_ctxt;
  12. }
  13. };

从展开的结果可以看到,dispatch_object_s的头部区域就是_os_object_s的内容,可以认为,dispatch_object_s"继承"自_os_object_s

dispatch_object_vtable_s由宏DISPATCH_CLASS_DECL_BARE定义:

  1. // 1. src/object_internal.h
  2. DISPATCH_CLASS_DECL_BARE(object, OBJECT);

DISPATCH_CLASS_DECL_BARE正是组成DISPATCH_CLASS_DECL的第 3 个宏。

DISPATCH_CLASS_DECL_BARE的定义如下:

  1. // 1. src/object_internal.h
  2. #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)扩展为:

  1. OS_OBJECT_CLASS_DECL(dispatch_object, DISPATCH_OBJECT_VTALBE_HEADER(dispatch_object))

DISPATCH_OBJECT_VTABLE_HEADER的定义如下:

  1. // 1. src/object_internal.h
  2. #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)
  3. // 2. src/internal.h
  4. #define DISPATCH_VTABLE_ENTRY(op) (* __ptrauth(ptrauth_key_process_independent_code, true, ptrauth_string_discriminator("dispatch." #op)) const op)

DISPATCH_VTALBE_ENTRY中的__ptrauthPAC指针认证有关,与 GCD 功能无关,扩展结果中可以剔除这些扩展,因此宏DISPATCH_OBJECT_VTABLE_HEADER的扩展结果为:

  1. unsigned const do_type;
  2. void * const do_dispose(struct dispatch_object_s *, bool *allow_free);
  3. size_t * const do_debug(struct dispatch_object_s *, char *, size_t);
  4. void * const do_invoke(struct dispatch_object_s *, dispatch_invoke_context_t, dispatch_invoke_flags_t);

OS_OBJECT_CLASS_DECL的定义如下:

  1. // 1. src/object_internal.h
  2. #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)))
  3. // 2. os/object_private.h
  4. #define OS_OBJECT_CLASS_SYMBOL(name) OS_##name##_class
  5. // 3. os/object_private.h
  6. #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)扩展之后的结果为:

  1. struct dispatch_object_s;
  2. struct dispatch_object_extra_vtable_s {
  3. unsigned const do_type;
  4. void * const do_dispose(struct dispatch_object_s *, bool *allow_free);
  5. size_t * const do_debug(struct dispatch_object_s *, char *, size_t);
  6. void * const do_invoke(struct dispatch_object_s *, dispatch_invoke_context_t, dispatch_invoke_flags_t);
  7. };
  8. struct dispatch_object_vtable_s {
  9. void *_os_obj_objc_class_t[5];
  10. struct dispatch_object_extra_vtable_s _os_obj_vtable;
  11. };
  12. 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. // 1. src/queue_internal.h
  2. struct dispatch_queue_s {
  3. DISPATCH_QUEUE_CLASS_HEADER(queue, void *__dq_opaque1);
  4. /* 32bit hole on LP64 */
  5. } DISPATCH_ATOMIC64_ALIGN;
  6. // 2. src/queue_internal.h
  7. #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
  8. // 3. src/queue_internal.h
  9. #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 )
  10. // 4. src/object_internal.h
  11. #define DISPATCH_OBJECT_HEADER(x) struct dispatch_object_s _as_do[0]; _DISPATCH_OBJECT_HEADER(x)

dispatch_queue_s完整的扩展结果如下:

  1. struct disaptch_queue_s {
  2. // 头部 dispatch_object_s 内容
  3. const struct dispatch_queue_vtable_s *__ptrauth_objc_isa_pointer do_vtable,
  4. int volatile do_ref_cnt;
  5. int volatile do_xref_cnt;
  6. struct dispatch_queue_s *volatile do_next;
  7. struct dispatch_queue_s *do_targetq;
  8. void *do_ctx;
  9. union {
  10. dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer;
  11. void *do_introspection_ctxt;
  12. };
  13. void *__dq_opaque1;
  14. union {
  15. uint64_t volatile dq_state;
  16. struct {
  17. dispatch_lock dq_state_lock;
  18. uint32_t dq_state_bits;
  19. };
  20. };
  21. /* LP64 global queue cacheline boundary */
  22. unsigned long dq_serialnum;
  23. const char *dq_label;
  24. union {
  25. uint32_t volatile dq_atomic_flags;
  26. struct {
  27. const uint16_t dq_width;
  28. const uint16_t __dq_opaque2;
  29. };
  30. };
  31. dispatch_priority_t dq_priority;
  32. union {
  33. struct dispatch_queue_specific_head_s *dq_specific_head;
  34. struct dispatch_source_refs_s *ds_refs;
  35. struct dispatch_timer_source_refs_s *ds_timer_refs;
  36. struct dispatch_mach_recv_refs_s *dm_recv_refs;
  37. struct dispatch_channel_callbacks_s const *dch_callbacks;
  38. };
  39. int volatile dq_sref_cnt
  40. }

disaptch_queue_vtable_s由宏DISPATCH_CLASS_DECL定义:

  1. // 1. src/queue_internal.h
  2. DISPATCH_CLASS_DECL(queue, QUEUE);
  3. // 2. src/object_internal.h
  4. #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,完整的扩展结果为:

  1. struct dispatch_queue_s;
  2. struct dispatch_queue_extra_vtable_s {
  3. unsigned long const do_type;
  4. void * const do_dispose(struct dispatch_queue_s *, bool *allow_free);
  5. size_t * const do_debug(struct dispatch_queue_s *, char *, size_t);
  6. void * const do_invoke(struct dispatch_queue_s *, dispatch_invoke_context_t, dispatch_qos_t);
  7. void * const dq_activate(dispatch_queue_class_t);
  8. void * const dq_wakeup(dispatch_queue_class_t, dispatch_qos_t, dispatch_wakeup_flags_t);
  9. void * const dq_push(dispatch_queue_class_t, dispatch_object_t, dispatch_qos_t);
  10. };
  11. struct dispatch_queue_vtable_s {
  12. void *_os_obj_objc_class_t[5];
  13. struct dispatch_queue_extra_vtable_s _os_obj_vtable;
  14. }
  15. 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. // 1. src/queue_internal.h
  2. typedef struct dispatch_lane_s {
  3. DISPATCH_LANE_CLASS_HEADER(lane);
  4. /* 32bit hole on LP64 */
  5. } DISPATCH_ATOMIC64_ALIGN *dispatch_lane_t;
  6. // 2. src/queue_internal.h
  7. #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

扩展之后的完整结果为:

  1. typedef struct dispatch_lane_s {
  2. // 这里是 dispatch_queue_s
  3. const struct dispatch_lane_vtable_s *__ptrauth_objc_isa_pointer do_vtable;
  4. int volatile do_ref_cnt;
  5. int volatile do_xref_cnt;
  6. struct dispatch_lane_s *volatile do_next;
  7. struct dispatch_queue_s *do_targetq;
  8. void *do_ctxt;
  9. union {
  10. dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer;
  11. void *do_introspection_ctxt;
  12. };
  13. struct dispatch_object_s *volatile dq_items_tail;
  14. union {
  15. uint64_t volatile dq_state;
  16. struct {
  17. dispatch_lock dq_state_lock;
  18. uint32_t dq_state_bits;
  19. };
  20. );
  21. /* LP64 global queue cacheline boundary */ unsigned long dq_serialnum; const char *dq_label; union {
  22. uint32_t volatile dq_atomic_flags;
  23. struct {
  24. const uint16_t dq_width;
  25. const uint16_t __dq_opaque2;
  26. };
  27. );
  28. dispatch_priority_t dq_priority;
  29. union {
  30. struct dispatch_queue_specific_head_s *dq_specific_head;
  31. struct dispatch_source_refs_s *ds_refs;
  32. struct dispatch_timer_source_refs_s *ds_timer_refs;
  33. struct dispatch_mach_recv_refs_s *dm_recv_refs;
  34. struct dispatch_channel_callbacks_s const *dch_callbacks;
  35. };
  36. int volatile dq_sref_cnt;
  37. dispatch_unfair_lock_s dq_sidelock;
  38. struct dispatch_object_s *volatile dq_items_head;
  39. uint32_t dq_side_suspend_cnt;
  40. } *dispatch_lane_t;

dispatch_lane_vtable_s由宏DISPATCH_CLASS_DECL_BARE定义:

  1. // 1. src/queue_internal.h
  2. DISPATCH_CLASS_DECL_BARE(lane, QUEUE);

dispatch_lane_vtable_s由宏OS_OBJECT_SUBCLASS_DECL定义,完整的展开结果为:

  1. struct dispatch_lane_s;
  2. struct dispatch_lane_extra_vtable_s {
  3. unsigned long const do_type;
  4. void * const do_dispose(struct dispatch_lane_s * bool *allow_free);
  5. size_t * const do_debug(struct dispatch_lane_s *, char *, size_t);
  6. void * const do_invoke(struct dispatch_lane_s * dispatch_invoke_context_t, dispatch_invoke_flags_t);
  7. void * const dq_activate(dispatch_queue_class_t);
  8. void * const dq_wakeup(dispatch_queue_class_t, dispatch_qos_t, dispatch_wakeup_flags_t);
  9. void * const dq_push(dispatch_queue_class_t, dispatch_object_t, dispatch_qos_t);
  10. }
  11. struct dispatch_lane_vtable_s {
  12. void *_os_obj_objc_class_t[5];
  13. struct dispatch_lane_extra_vtable_s _os_obj_vtable;
  14. }
  15. extern const struct dispatch_lane_vtable_s OS_dispatch_lane_class __asm__("_OBJC_CLASS_$_OS_dispatch_lane")

dispatch_lane_vtable_s有关的 3 个宏定义如下:

  1. // 1. src/queue_internal.h
  2. DISPATCH_SUBCLASS_DECL(queue_serial, queue_serial_executor, lane);
  3. DISPATCH_SUBCLASS_DECL(queue_main, queue_serial, lane);
  4. DISPATCH_SUBCLASS_DECL(queue_concurrent, queue, lane);
  5. DISPATCH_SUBCLASS_DECL(queue_global, queue, lane);
  6. // 2. src/object_internal.h
  7. #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)
  8. // 3. src/object_internal.h
  9. // define a new subclass used in a cluster
  10. #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 个宏展开之后的结果为:

  1. struct dispatch_queue_serial_s;
  2. extern const struct dispatch_lane_vtable_s OS_dispatch_queue_serial_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue_serial");
  3. struct dispatch_queue_main_s;
  4. extern const struct dispatch_lane_vtable_s OS_dispatch_queue_main_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue_main");
  5. struct dispatch_queue_concurrent_s;
  6. extern const struct dispatch_lane_vtable_s OS_dispatch_queue_concurrent_class __asm__("_OBJC_CLASS_$_OS_dispatch_concurrent");
  7. struct dispatch_queue_global_s;
  8. extern const struct dispatch_lane_vtable_s OS_dispatch_queue_global_class __asm__("_OBJC_CLASS_$_OS_dispatch_queue_global");
  1. ## 3.6 dispatch_queue_global_s
  2. `dispatch_queue_global_s`定义如下:
  3. ```c++
  4. // 1. src/queue_internal.h
  5. struct dispatch_queue_global_s {
  6. DISPATCH_QUEUE_ROOT_CLASS_HEADER(lane);
  7. } DISPATCH_CACHELINE_ALIGN;
  8. // 2. src/queue_internal.h
  9. #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;

完整扩展结果如下:

  1. typedef struct dispatch_queue_global_s {
  2. // 这里是 dispatch_queue_s
  3. const struct dispatch_lane_vtable_s *__ptrauth_objc_isa_pointer do_vtable;
  4. int volatile do_ref_cnt;
  5. int volatile do_xref_cnt;
  6. struct dispatch_lane_s *volatile do_next;
  7. struct dispatch_queue_s *do_targetq;
  8. void *do_ctxt;
  9. union {
  10. dispatch_function_t DISPATCH_FUNCTION_POINTER do_finalizer;
  11. void *do_introspection_ctxt;
  12. };
  13. struct dispatch_object_s *volatile dq_items_tail;
  14. union {
  15. uint64_t volatile dq_state;
  16. struct {
  17. dispatch_lock dq_state_lock;
  18. uint32_t dq_state_bits;
  19. };
  20. );
  21. /* LP64 global queue cacheline boundary */ unsigned long dq_serialnum; const char *dq_label; union {
  22. uint32_t volatile dq_atomic_flags;
  23. struct {
  24. const uint16_t dq_width;
  25. const uint16_t __dq_opaque2;
  26. };
  27. );
  28. dispatch_priority_t dq_priority;
  29. union {
  30. struct dispatch_queue_specific_head_s *dq_specific_head;
  31. struct dispatch_source_refs_s *ds_refs;
  32. struct dispatch_timer_source_refs_s *ds_timer_refs;
  33. struct dispatch_mach_recv_refs_s *dm_recv_refs;
  34. struct dispatch_channel_callbacks_s const *dch_callbacks;
  35. };
  36. int volatile dq_sref_cnt;
  37. int volatile dgq_thread_pool_size;
  38. struct dispatch_object_s *volatile dq_items_head;
  39. int volatile dgq_pending;
  40. }

3.7 dispatch_queue_class_t

dispatch_queue_class_t的定义如下:

  1. // 1. src/internal.h
  2. // Dispatch queue cluster class: type for any dispatch_queue_t
  3. typedef union {
  4. struct dispatch_queue_s *_dq;
  5. struct dispatch_workloop_s *_dwl;
  6. struct dispatch_lane_s *_dl;
  7. struct dispatch_queue_static_s *_dsq;
  8. struct dispatch_queue_global_s *_dgq;
  9. struct dispatch_queue_pthread_root_s *_dpq;
  10. struct dispatch_source_s *_ds;
  11. struct dispatch_channel_s *_dch;
  12. struct dispatch_mach_s *_dm;
  13. dispatch_lane_class_t _dlu;
  14. #ifdef __OBJC__
  15. id<OS_dispatch_queue> _objc_dq;
  16. #endif
  17. } dispatch_queue_class_t DISPATCH_TRANSPARENT_UNION;

原文链接:https://www.cnblogs.com/chaoguo1234/p/17828302.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号