[dpdk-dev] [RFC PATCH 2/3] lib/ring: add peek API
Ruifeng Wang
ruifeng.wang at arm.com
Thu Aug 22 08:34:56 CEST 2019
The peek API allows fetching the next available object in the ring
without dequeuing it. This helps in scenarios where dequeuing of
objects depend on their value.
Signed-off-by: Dharmik Thakkar <dharmik.thakkar at arm.com>
Signed-off-by: Ruifeng Wang <ruifeng.wang at arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli at arm.com>
Reviewed-by: Gavin Hu <gavin.hu at arm.com>
---
lib/librte_ring/rte_ring.h | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h
index 2a9f768a1..d3d0d5e18 100644
--- a/lib/librte_ring/rte_ring.h
+++ b/lib/librte_ring/rte_ring.h
@@ -953,6 +953,36 @@ rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table,
r->cons.single, available);
}
+/**
+ * Peek one object from a ring.
+ *
+ * The peek API allows fetching the next available object in the ring
+ * without dequeuing it. This API is not multi-thread safe with respect
+ * to other consumer threads.
+ *
+ * @param r
+ * A pointer to the ring structure.
+ * @param obj_p
+ * A pointer to a void * pointer (object) that will be filled.
+ * @return
+ * - 0: Success, object available
+ * - -ENOENT: Not enough entries in the ring.
+ */
+__rte_experimental
+static __rte_always_inline int
+rte_ring_peek(struct rte_ring *r, void **obj_p)
+{
+ uint32_t prod_tail = r->prod.tail;
+ uint32_t cons_head = r->cons.head;
+ uint32_t count = (prod_tail - cons_head) & r->mask;
+ unsigned int n = 1;
+ if (count) {
+ DEQUEUE_PTRS(r, &r[1], cons_head, obj_p, n, void *);
+ return 0;
+ }
+ return -ENOENT;
+}
+
#ifdef __cplusplus
}
#endif
--
2.17.1
More information about the dev
mailing list