From: Leonid Myravjev <myrav...@amicon.ru> Signed-off-by: Leonid Myravjev <myrav...@amicon.ru> --- lib/librte_eal/common/include/generic/rte_rwlock.h | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+)
diff --git a/lib/librte_eal/common/include/generic/rte_rwlock.h b/lib/librte_eal/common/include/generic/rte_rwlock.h index 899e9bc43..11212e2b8 100644 --- a/lib/librte_eal/common/include/generic/rte_rwlock.h +++ b/lib/librte_eal/common/include/generic/rte_rwlock.h @@ -76,6 +76,30 @@ rte_rwlock_read_lock(rte_rwlock_t *rwl) } /** + * Try take lock a read lock. + * + * @param rwl + * A pointer to a rwlock structure. + * @return + * 1 if the lock is successfully taken; 0 otherwise. + */ +static inline int +rte_rwlock_read_trylock(rte_rwlock_t *rwl) +{ + int32_t x; + int success = 0; + + x = rwl->cnt; + /* write lock is held */ + if (x < 0) + return 0; + success = rte_atomic32_cmpset((volatile uint32_t *)&rwl->cnt, x, x + 1); + if (success == 0) + return 0; + return 1; +} + +/** * Release a read lock. * * @param rwl @@ -110,6 +134,29 @@ rte_rwlock_write_lock(rte_rwlock_t *rwl) 0, -1); } } +/** + * Try take a write lock. + * + * @param rwl + * A pointer to a rwlock structure. + * @return + * 1 if the lock is successfully taken; 0 otherwise. + */ +static inline int +rte_rwlock_write_trylock(rte_rwlock_t *rwl) +{ + int32_t x; + int success = 0; + + x = rwl->cnt; + /* a lock is held */ + if (x != 0) + return 0; + success = rte_atomic32_cmpset((volatile uint32_t *)&rwl->cnt, 0, -1); + if (success == 0) + return 0; + return 1; +} /** * Release a write lock. @@ -124,6 +171,20 @@ rte_rwlock_write_unlock(rte_rwlock_t *rwl) } /** + * Relock write lock to read + * + * @param rwl + * A pointer to a rwlock structure. + */ +static inline void +rte_rwlock_write_relock_read(rte_rwlock_t *rwl) +{ + rte_atomic32_add((rte_atomic32_t *)(intptr_t)&rwl->cnt, 2); +} + + + +/** * Try to execute critical section in a hardware memory transaction, if it * fails or not available take a read lock * -- 2.13.0