aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2016-01-20 11:19:31 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:24 +0300
commit7bd0eab46d20563801255fb4cec6796beefa7a0d (patch)
treeb0b229df6d5ed374906f5ef919279363e0cae52d /platform
parent87e75c7bf192d91400b7c7ab56c796d35d98f10c (diff)
linux-generic: locks: replace internal atomics
Replace internal non-relaxed atomics with API calls. Timer and spinlock were not converted since those use flags and 128 variables. 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_pool_internal.h1
-rw-r--r--platform/linux-generic/odp_pool.c1
-rw-r--r--platform/linux-generic/odp_rwlock.c23
-rw-r--r--platform/linux-generic/odp_ticketlock.c21
4 files changed, 14 insertions, 32 deletions
diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h
index ae4836cc8..fdac6067e 100644
--- a/platform/linux-generic/include/odp_pool_internal.h
+++ b/platform/linux-generic/include/odp_pool_internal.h
@@ -28,7 +28,6 @@ extern "C" {
#include <odp/debug.h>
#include <odp/shared_memory.h>
#include <odp/atomic.h>
-#include <odp_atomic_internal.h>
#include <odp/thread.h>
#include <string.h>
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c
index a3fcac373..64668cc3d 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -19,7 +19,6 @@
#include <odp/hints.h>
#include <odp/thread.h>
#include <odp_debug_internal.h>
-#include <odp_atomic_internal.h>
#include <string.h>
#include <stdlib.h>
diff --git a/platform/linux-generic/odp_rwlock.c b/platform/linux-generic/odp_rwlock.c
index 0b8bb46b7..42ad0ccdb 100644
--- a/platform/linux-generic/odp_rwlock.c
+++ b/platform/linux-generic/odp_rwlock.c
@@ -6,7 +6,6 @@
#include <stdbool.h>
#include <odp/atomic.h>
-#include <odp_atomic_internal.h>
#include <odp/rwlock.h>
#include <odp/cpu.h>
@@ -21,23 +20,20 @@ void odp_rwlock_read_lock(odp_rwlock_t *rwlock)
int is_locked = 0;
while (is_locked == 0) {
- cnt = _odp_atomic_u32_load_mm(&rwlock->cnt, _ODP_MEMMODEL_RLX);
+ cnt = odp_atomic_load_u32(&rwlock->cnt);
/* waiting for read lock */
if ((int32_t)cnt < 0) {
odp_cpu_pause();
continue;
}
- is_locked = _odp_atomic_u32_cmp_xchg_strong_mm(&rwlock->cnt,
- &cnt,
- cnt + 1,
- _ODP_MEMMODEL_ACQ,
- _ODP_MEMMODEL_RLX);
+ is_locked = odp_atomic_cas_acq_u32(&rwlock->cnt,
+ &cnt, cnt + 1);
}
}
void odp_rwlock_read_unlock(odp_rwlock_t *rwlock)
{
- _odp_atomic_u32_sub_mm(&rwlock->cnt, 1, _ODP_MEMMODEL_RLS);
+ odp_atomic_sub_rel_u32(&rwlock->cnt, 1);
}
void odp_rwlock_write_lock(odp_rwlock_t *rwlock)
@@ -47,21 +43,18 @@ void odp_rwlock_write_lock(odp_rwlock_t *rwlock)
while (is_locked == 0) {
uint32_t zero = 0;
- cnt = _odp_atomic_u32_load_mm(&rwlock->cnt, _ODP_MEMMODEL_RLX);
+ cnt = odp_atomic_load_u32(&rwlock->cnt);
/* lock acquired, wait */
if (cnt != 0) {
odp_cpu_pause();
continue;
}
- is_locked = _odp_atomic_u32_cmp_xchg_strong_mm(&rwlock->cnt,
- &zero,
- (uint32_t)-1,
- _ODP_MEMMODEL_ACQ,
- _ODP_MEMMODEL_RLX);
+ is_locked = odp_atomic_cas_acq_u32(&rwlock->cnt,
+ &zero, (uint32_t)-1);
}
}
void odp_rwlock_write_unlock(odp_rwlock_t *rwlock)
{
- _odp_atomic_u32_store_mm(&rwlock->cnt, 0, _ODP_MEMMODEL_RLS);
+ odp_atomic_store_rel_u32(&rwlock->cnt, 0);
}
diff --git a/platform/linux-generic/odp_ticketlock.c b/platform/linux-generic/odp_ticketlock.c
index 6ab2b9a6a..84b893a5c 100644
--- a/platform/linux-generic/odp_ticketlock.c
+++ b/platform/linux-generic/odp_ticketlock.c
@@ -6,18 +6,15 @@
#include <odp/ticketlock.h>
#include <odp/atomic.h>
-#include <odp_atomic_internal.h>
#include <odp/sync.h>
#include <odp/cpu.h>
-
void odp_ticketlock_init(odp_ticketlock_t *ticketlock)
{
odp_atomic_init_u32(&ticketlock->next_ticket, 0);
odp_atomic_init_u32(&ticketlock->cur_ticket, 0);
}
-
void odp_ticketlock_lock(odp_ticketlock_t *ticketlock)
{
uint32_t ticket;
@@ -29,8 +26,7 @@ void odp_ticketlock_lock(odp_ticketlock_t *ticketlock)
/* Spin waiting for our turn. Use load-acquire so that we acquire
* all stores from the previous lock owner */
- while (ticket != _odp_atomic_u32_load_mm(&ticketlock->cur_ticket,
- _ODP_MEMMODEL_ACQ))
+ while (ticket != odp_atomic_load_acq_u32(&ticketlock->cur_ticket))
odp_cpu_pause();
}
@@ -55,11 +51,8 @@ int odp_ticketlock_trylock(odp_ticketlock_t *tklock)
* If CAS fails, it means some other thread intercepted and
* took a ticket which means the lock is not available
* anymore */
- if (_odp_atomic_u32_cmp_xchg_strong_mm(&tklock->next_ticket,
- &next,
- next + 1,
- _ODP_MEMMODEL_ACQ,
- _ODP_MEMMODEL_RLX))
+ if (odp_atomic_cas_acq_u32(&tklock->next_ticket,
+ &next, next + 1))
return 1;
}
return 0;
@@ -72,17 +65,15 @@ void odp_ticketlock_unlock(odp_ticketlock_t *ticketlock)
* 'cur_ticket', we don't need to do this with an (expensive)
* atomic RMW operation. Instead load-relaxed the current value
* and a store-release of the incremented value */
- uint32_t cur = _odp_atomic_u32_load_mm(&ticketlock->cur_ticket,
- _ODP_MEMMODEL_RLX);
- _odp_atomic_u32_store_mm(&ticketlock->cur_ticket, cur + 1,
- _ODP_MEMMODEL_RLS);
+ uint32_t cur = odp_atomic_load_u32(&ticketlock->cur_ticket);
+
+ odp_atomic_store_rel_u32(&ticketlock->cur_ticket, cur + 1);
#if defined __OCTEON__
odp_sync_stores(); /* SYNCW to flush write buffer */
#endif
}
-
int odp_ticketlock_is_locked(odp_ticketlock_t *ticketlock)
{
/* Compare 'cur_ticket' with 'next_ticket'. Ideally we should read