что на самом деле делает os_atomic_or2o? - PullRequest
0 голосов
/ 07 января 2020

Когда я погрузился в исходный код 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.

И, наконец, выполняется операция | и конец. Где код назначения ...

1 Ответ

0 голосов
/ 07 января 2020

Найдите секрет за макросом os_atomic_or2o, код присваивания __c11_atomic_fetch_or, который __atomic_fetch_or, а в G CC ссылка на встроенные функции , эта функция назначит новое значение первому парам.

...