aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2016-01-20 11:19:26 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:24 +0300
commit775fae801febf91816c9c0df6da6d6a4839b2d7b (patch)
tree77dddca3e8bc6776f1110a1dd60457d758167124 /platform
parent5a2e87a417951ce3842197b6db116ebbd14ff55d (diff)
linux-generic: atomic: implemented exchange
Implemented 32 and 64 bit atomic exchange operations. Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-by: Ola Liljedahl <ola.liljedahl@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/include/odp/atomic.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/platform/linux-generic/include/odp/atomic.h b/platform/linux-generic/include/odp/atomic.h
index e86754467..4756fcb60 100644
--- a/platform/linux-generic/include/odp/atomic.h
+++ b/platform/linux-generic/include/odp/atomic.h
@@ -93,6 +93,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;
@@ -233,6 +239,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;