X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Finclude%2Fgeneric%2Frte_rwlock.h;h=b05d85aeecc9aa17e1bc21eeedb1c010d2b90c61;hb=d5b46fc363963f32b53b26e856797c49943d2d4c;hp=5751a0e6d5b9fb6d5e2ce88f057cee570829aef9;hpb=7079e29f7f28661b712620f46e6a8514eb0a708a;p=dpdk.git diff --git a/lib/librte_eal/common/include/generic/rte_rwlock.h b/lib/librte_eal/common/include/generic/rte_rwlock.h index 5751a0e6d5..b05d85aeec 100644 --- a/lib/librte_eal/common/include/generic/rte_rwlock.h +++ b/lib/librte_eal/common/include/generic/rte_rwlock.h @@ -75,6 +75,36 @@ rte_rwlock_read_lock(rte_rwlock_t *rwl) } } +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * try to take a read lock. + * + * @param rwl + * A pointer to a rwlock structure. + * @return + * - zero if the lock is successfully taken + * - -EBUSY if lock could not be acquired for reading because a + * writer holds the lock + */ +static inline __rte_experimental int +rte_rwlock_read_trylock(rte_rwlock_t *rwl) +{ + int32_t x; + int success = 0; + + while (success == 0) { + x = rwl->cnt; + /* write lock is held */ + if (x < 0) + return -EBUSY; + success = rte_atomic32_cmpset((volatile uint32_t *)&rwl->cnt, + (uint32_t)x, (uint32_t)(x + 1)); + } + return 0; +} + /** * Release a read lock. * @@ -87,6 +117,32 @@ rte_rwlock_read_unlock(rte_rwlock_t *rwl) rte_atomic32_dec((rte_atomic32_t *)(intptr_t)&rwl->cnt); } +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * try to take a write lock. + * + * @param rwl + * A pointer to a rwlock structure. + * @return + * - zero if the lock is successfully taken + * - -EBUSY if lock could not be acquired for writing because + * it was already locked for reading or writing + */ +static inline __rte_experimental int +rte_rwlock_write_trylock(rte_rwlock_t *rwl) +{ + int32_t x; + + x = rwl->cnt; + if (x != 0 || rte_atomic32_cmpset((volatile uint32_t *)&rwl->cnt, + 0, (uint32_t)-1) == 0) + return -EBUSY; + + return 0; +} + /** * Take a write lock. Loop until the lock is held. *