bool atomic_tas_xxx(xxx *p, xxx m) { unsigned o, n; do { o = *p; if (o & m) return true; n = o | m; } while (atomic_cas_xxx(p, o, n) != o); return false; }