os_atomic_or2o实际做什么?

时间:2020-01-07 13:22:15

标签: c gcc grand-central-dispatch

当我深入研究GCD(大中央调度)的源代码时,我发现下面显示的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宏似乎在DBF_CANCELED中设置了dbpd,这是该块的私有数据。 但是使用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操作初始化的变量。

最后执行|操作并结束。 分配代码在哪里...

1 个答案:

答案 0 :(得分:0)

找到宏os_atomic_or2o后面的秘密,分配代码为__c11_atomic_fetch_or__atomic_fetch_or,在GCC built_in functions referrence中,此函数将为第一个参数分配新值。

相关问题