os_atomic_or2o 实际上是做什么的?
what does os_atomic_or2o actually do?
当我深入研究 GCD (Grand Central Dispatch) 的源代码时,我发现 dispatch_block_cancel
中使用的一些低级 C 函数如下所示
dispatch_block_cancel(dispatch_block_t db)
{
dispatch_block_private_data_t dbpd = _dispatch_block_get_data(db);
if (unlikely(!dbpd)) {
DISPATCH_CLIENT_CRASH(0, "Invalid block object passed to "
"dispatch_block_cancel()");
}
(void)os_atomic_or2o(dbpd, dbpd_atomic_flags, DBF_CANCELED, relaxed);
}
os_atomic_or2o
宏似乎在dbpd
中设置了DBF_CANCELED
,这是块的私有数据。
但是使用gcc -E
展开宏后,我找不到任何设置行为。
(void)({
__typeof__(__c11_atomic_load(((__typeof__(*((&(dbpd)->dbpd_atomic_flags))) _Atomic *)((&(dbpd)->dbpd_atomic_flags))), memory_order_relaxed)) _v = (((1u))),
_r = __c11_atomic_fetch_or(((__typeof__(*((&(dbpd)->dbpd_atomic_flags))) _Atomic *)((&(dbpd)->dbpd_atomic_flags))), _v, memory_order_relaxed);
(__typeof__(_r))(_r | _v);
});
_v
是由 &(dbpd)->dbpd_atomic_flags
的类型初始化的变量,1u
的值。
_r
是_v
和&(dbpd)->dbpd_atomic_flags
之间|
操作初始化的变量。
最后做一个|
操作结束。
分配代码在哪里...
找到宏os_atomic_or2o
背后的秘密,赋值代码为__c11_atomic_fetch_or
,即__atomic_fetch_or
,在GCC built_in functions referrence中,该函数将对第一个赋值参数
当我深入研究 GCD (Grand Central Dispatch) 的源代码时,我发现 dispatch_block_cancel
中使用的一些低级 C 函数如下所示
dispatch_block_cancel(dispatch_block_t db)
{
dispatch_block_private_data_t dbpd = _dispatch_block_get_data(db);
if (unlikely(!dbpd)) {
DISPATCH_CLIENT_CRASH(0, "Invalid block object passed to "
"dispatch_block_cancel()");
}
(void)os_atomic_or2o(dbpd, dbpd_atomic_flags, DBF_CANCELED, relaxed);
}
os_atomic_or2o
宏似乎在dbpd
中设置了DBF_CANCELED
,这是块的私有数据。
但是使用gcc -E
展开宏后,我找不到任何设置行为。
(void)({
__typeof__(__c11_atomic_load(((__typeof__(*((&(dbpd)->dbpd_atomic_flags))) _Atomic *)((&(dbpd)->dbpd_atomic_flags))), memory_order_relaxed)) _v = (((1u))),
_r = __c11_atomic_fetch_or(((__typeof__(*((&(dbpd)->dbpd_atomic_flags))) _Atomic *)((&(dbpd)->dbpd_atomic_flags))), _v, memory_order_relaxed);
(__typeof__(_r))(_r | _v);
});
_v
是由 &(dbpd)->dbpd_atomic_flags
的类型初始化的变量,1u
的值。
_r
是_v
和&(dbpd)->dbpd_atomic_flags
之间|
操作初始化的变量。
最后做一个|
操作结束。
分配代码在哪里...
找到宏os_atomic_or2o
背后的秘密,赋值代码为__c11_atomic_fetch_or
,即__atomic_fetch_or
,在GCC built_in functions referrence中,该函数将对第一个赋值参数