]> git.proxmox.com Git - mirror_ovs.git/blame - lib/ovs-atomic-locked.h
ofp-ed-props: Fix using uninitialized padding for NSH encap actions.
[mirror_ovs.git] / lib / ovs-atomic-locked.h
CommitLineData
1bd2c9ed
BP
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."
4#endif
5
6#define OVS_ATOMIC_LOCKED_IMPL 1
7
8void atomic_lock__(void *);
9void atomic_unlock__(void *);
10
11#define atomic_store_locked(DST, SRC) \
12 (atomic_lock__(DST), \
13 *(DST) = (SRC), \
14 atomic_unlock__(DST), \
15 (void) 0)
16
17#define atomic_read_locked(SRC, DST) \
18 (atomic_lock__(SRC), \
19 *(DST) = *(SRC), \
20 atomic_unlock__(SRC), \
21 (void) 0)
22
25045d75
JR
23/* XXX: Evaluates EXP multiple times. */
24#define atomic_compare_exchange_locked(DST, EXP, SRC) \
25 (atomic_lock__(DST), \
26 (*(DST) == *(EXP) \
27 ? (*(DST) = (SRC), \
28 atomic_unlock__(DST), \
29 true) \
30 : (*(EXP) = *(DST), \
31 atomic_unlock__(DST), \
32 false)))
33
1bd2c9ed
BP
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), \
41 *(ORIG) = *(RMW), \
42 *(RMW) atomic_op_locked_##OP (OPERAND), \
43 atomic_unlock__(RMW))