Implemented 32 and 64 bit atomic exchange operations.

Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
---
 platform/linux-generic/include/odp/atomic.h | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/platform/linux-generic/include/odp/atomic.h 
b/platform/linux-generic/include/odp/atomic.h
index 4fbf4c4..8644fdb 100644
--- a/platform/linux-generic/include/odp/atomic.h
+++ b/platform/linux-generic/include/odp/atomic.h
@@ -94,6 +94,12 @@ static inline int odp_atomic_cas_u32(odp_atomic_u32_t *atom, 
uint32_t *old_val,
                                           __ATOMIC_RELAXED);
 }
 
+static inline uint32_t odp_atomic_xchg_u32(odp_atomic_u32_t *atom,
+                                          uint32_t new_val)
+{
+       return __atomic_exchange_n(&atom->v, new_val, __ATOMIC_RELAXED);
+}
+
 static inline void odp_atomic_max_u32(odp_atomic_u32_t *atom, uint32_t new_max)
 {
        uint32_t old_val;
@@ -234,6 +240,16 @@ static inline int odp_atomic_cas_u64(odp_atomic_u64_t 
*atom, uint64_t *old_val,
 #endif
 }
 
+static inline uint64_t odp_atomic_xchg_u64(odp_atomic_u64_t *atom,
+                                          uint64_t new_val)
+{
+#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
+       return ATOMIC_OP(atom, atom->v = new_val);
+#else
+       return __atomic_exchange_n(&atom->v, new_val, __ATOMIC_RELAXED);
+#endif
+}
+
 static inline void odp_atomic_max_u64(odp_atomic_u64_t *atom, uint64_t new_max)
 {
        uint64_t old_val;
-- 
2.6.3

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to