Когда я погрузился в исходный код GCD (Grand Central Dispatch), я обнаружил некоторые низкоуровневые C функции, используемые в dispatch_block_cancel
, показанном ниже
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
.
И, наконец, выполняется операция |
и конец. Где код назначения ...