^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) C Atomic-RMW-ops-are-atomic-WRT-atomic_set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) (*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Result: Never
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Test that atomic_set() cannot break the atomicity of atomic RMWs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * NOTE: This requires herd7 7.56 or later which supports "(void)expr".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) atomic_t v = ATOMIC_INIT(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) P0(atomic_t *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) (void)atomic_add_unless(v, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) P1(atomic_t *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) atomic_set(v, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) exists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) (v=2)