]>
git.proxmox.com Git - mirror_ovs.git/blob - lib/ovs-atomic-locked.h
1 /* This header implements atomic operation locking helpers. */
2 #ifndef IN_OVS_ATOMIC_H
3 #error "This header should only be included indirectly via ovs-atomic.h."
6 #define OVS_ATOMIC_LOCKED_IMPL 1
8 void atomic_lock__(void *);
9 void atomic_unlock__(void *);
11 #define atomic_store_locked(DST, SRC) \
12 (atomic_lock__(DST), \
14 atomic_unlock__(DST), \
17 #define atomic_read_locked(SRC, DST) \
18 (atomic_lock__(SRC), \
20 atomic_unlock__(SRC), \
23 /* XXX: Evaluates EXP multiple times. */
24 #define atomic_compare_exchange_locked(DST, EXP, SRC) \
25 (atomic_lock__(DST), \
28 atomic_unlock__(DST), \
31 atomic_unlock__(DST), \
34 #define atomic_op_locked_add +=
35 #define atomic_op_locked_sub -=
36 #define atomic_op_locked_or |=
37 #define atomic_op_locked_xor ^=
38 #define atomic_op_locked_and &=
39 #define atomic_op_locked(RMW, OP, OPERAND, ORIG) \
40 (atomic_lock__(RMW), \
42 *(RMW) atomic_op_locked_##OP (OPERAND), \