[dpdk-dev] [PATCH] eal/rwlocks: Try read/write and relock write to read locks added.
Leonid Myravjev
asm at asm.pp.ru
Mon May 21 11:08:12 CEST 2018
From: Leonid Myravjev <myravjev at amicon.ru>
Signed-off-by: Leonid Myravjev <myravjev at 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
More information about the dev
mailing list