ovs-atomic: Use raw types, not structs, when locks are required.
[sliver-openvswitch.git] / lib / ovs-atomic-locked.h
diff --git a/lib/ovs-atomic-locked.h b/lib/ovs-atomic-locked.h
new file mode 100644 (file)
index 0000000..438e78c
--- /dev/null
@@ -0,0 +1,32 @@
+/* This header implements atomic operation locking helpers. */
+#ifndef IN_OVS_ATOMIC_H
+#error "This header should only be included indirectly via ovs-atomic.h."
+#endif
+
+#define OVS_ATOMIC_LOCKED_IMPL 1
+
+void atomic_lock__(void *);
+void atomic_unlock__(void *);
+
+#define atomic_store_locked(DST, SRC)           \
+    (atomic_lock__(DST),                        \
+     *(DST) = (SRC),                            \
+     atomic_unlock__(DST),                      \
+     (void) 0)
+
+#define atomic_read_locked(SRC, DST)            \
+    (atomic_lock__(SRC),                        \
+     *(DST) = *(SRC),                           \
+     atomic_unlock__(SRC),                      \
+     (void) 0)
+
+#define atomic_op_locked_add +=
+#define atomic_op_locked_sub -=
+#define atomic_op_locked_or  |=
+#define atomic_op_locked_xor ^=
+#define atomic_op_locked_and &=
+#define atomic_op_locked(RMW, OP, OPERAND, ORIG)    \
+    (atomic_lock__(RMW),                            \
+     *(ORIG) = *(RMW),                              \
+     *(RMW) atomic_op_locked_##OP (OPERAND),        \
+     atomic_unlock__(RMW))