aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/odp_rwlock.c
diff options
context:
space:
mode:
authorBill Fischofer <bill.fischofer@linaro.org>2016-03-06 07:10:31 +1100
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-04-21 18:54:41 +0300
commit7e4d875d95cbcbac45627d17330e56b99d033ccb (patch)
tree19a3fd242a194c64ec73a4b8ad81123c4a4011c1 /platform/linux-generic/odp_rwlock.c
parent1906cf41fa2738c370b4371c1e8508e844f3f9e0 (diff)
linux-generic: rwlock: implement trylock variants of rwlock and rwlock_recursive
Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform/linux-generic/odp_rwlock.c')
-rw-r--r--platform/linux-generic/odp_rwlock.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/platform/linux-generic/odp_rwlock.c b/platform/linux-generic/odp_rwlock.c
index f50fd5f2a..13c17a2c7 100644
--- a/platform/linux-generic/odp_rwlock.c
+++ b/platform/linux-generic/odp_rwlock.c
@@ -31,6 +31,13 @@ void odp_rwlock_read_lock(odp_rwlock_t *rwlock)
}
}
+int odp_rwlock_read_trylock(odp_rwlock_t *rwlock)
+{
+ uint32_t zero = 0;
+
+ return odp_atomic_cas_acq_u32(&rwlock->cnt, &zero, (uint32_t)1);
+}
+
void odp_rwlock_read_unlock(odp_rwlock_t *rwlock)
{
odp_atomic_sub_rel_u32(&rwlock->cnt, 1);
@@ -54,6 +61,13 @@ void odp_rwlock_write_lock(odp_rwlock_t *rwlock)
}
}
+int odp_rwlock_write_trylock(odp_rwlock_t *rwlock)
+{
+ uint32_t zero = 0;
+
+ return odp_atomic_cas_acq_u32(&rwlock->cnt, &zero, (uint32_t)-1);
+}
+
void odp_rwlock_write_unlock(odp_rwlock_t *rwlock)
{
odp_atomic_store_rel_u32(&rwlock->cnt, 0);