Ваша функция будет эквивалентна этой функции (они, вероятно, даже скомпилируются с точно таким же кодом):
static inline test_and_set_bit(volatile void *addr, int nr, int set) {
const int bit = set ? 2 << nr : 0;
__sync_fetch_and_or(addr, bit);
}
Выражение не будет оцениваться «атомарно», но поскольку оно включает все локальные переменныеэто не актуально.__sync_fetch_and_or
будет выполнено атомарно.Возможно, вы захотите изменить свою функцию, чтобы она выглядела так, чтобы люди, пришедшие за вами, не запутались.