Kiedy nurkuję do kodu źródłowego GCD (Grand Central Dispatch), znalazłem kilka funkcji niskiego poziomu C stosowane w dispatch_block_cancel pokazano poniżej

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);
}

Makro os_atomic_or2o wydaje się ustawić DBF_CANCELED w dbpd, które są prywatnymi danymi bloków. Ale po użyciu gcc -E Rozwiń makro, nie mogę znaleźć żadnych zachowań ustawień.

(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 jest zmienną zapięty przez typ &(dbpd)->dbpd_atomic_flags, wartość 1u.

_r jest zmienną wejściem przez | operacja między _v i &(dbpd)->dbpd_atomic_flags.

I wreszcie wykonaj pracę |. Gdzie jest kod przypisujący ...

0
folobe 7 styczeń 2020, 16:22

1 odpowiedź

Najlepsza odpowiedź

Znajdź sekret za makro {x0}}, kod przypisujący jest __c11_atomic_fetch_or, który jest __atomic_fetch_or i w GCC Wbudowana funkcja Funkcje RZECZY, ta funkcja przypisuje nową wartość na pierwszy param.

0
folobe 7 styczeń 2020, 13:35