#include <rte_ring_core.h>
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
* Calculate the memory size needed for a ring with given element size
*
* This function returns the number of bytes needed for a ring, given
* - -EINVAL - esize is not a multiple of 4 or count provided is not a
* power of 2.
*/
-__rte_experimental
ssize_t rte_ring_get_memsize_elem(unsigned int esize, unsigned int count);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
* Create a new ring named *name* that stores elements with given size.
*
* This function uses ``memzone_reserve()`` to allocate memory. Then it
* - RING_F_MP_RTS_ENQ: If this flag is set, the default behavior when
* using ``rte_ring_enqueue()`` or ``rte_ring_enqueue_bulk()``
* is "multi-producer RTS mode".
+ * - RING_F_MP_HTS_ENQ: If this flag is set, the default behavior when
+ * using ``rte_ring_enqueue()`` or ``rte_ring_enqueue_bulk()``
+ * is "multi-producer HTS mode".
* If none of these flags is set, then default "multi-producer"
* behavior is selected.
* - One of mutually exclusive flags that define consumer behavior:
* - RING_F_MC_RTS_DEQ: If this flag is set, the default behavior when
* using ``rte_ring_dequeue()`` or ``rte_ring_dequeue_bulk()``
* is "multi-consumer RTS mode".
+ * - RING_F_MC_HTS_DEQ: If this flag is set, the default behavior when
+ * using ``rte_ring_dequeue()`` or ``rte_ring_dequeue_bulk()``
+ * is "multi-consumer HTS mode".
* If none of these flags is set, then default "multi-consumer"
* behavior is selected.
* @return
* - EEXIST - a memzone with the same name already exists
* - ENOMEM - no appropriate memory area found in which to create memzone
*/
-__rte_experimental
struct rte_ring *rte_ring_create_elem(const char *name, unsigned int esize,
unsigned int count, int socket_id, unsigned int flags);
* (powerpc/arm).
* There are 2 choices for the users
* 1.use rmb() memory barrier
- * 2.use one-direction load_acquire/store_release barrier,defined by
- * CONFIG_RTE_USE_C11_MEM_MODEL=y
+ * 2.use one-direction load_acquire/store_release barrier
* It depends on performance test results.
* By default, move common functions to rte_ring_generic.h
*/
}
#ifdef ALLOW_EXPERIMENTAL_API
+#include <rte_ring_hts.h>
#include <rte_ring_rts.h>
#endif
rte_ring_enqueue_bulk_elem(struct rte_ring *r, const void *obj_table,
unsigned int esize, unsigned int n, unsigned int *free_space)
{
- return __rte_ring_do_enqueue_elem(r, obj_table, esize, n,
- RTE_RING_QUEUE_FIXED, r->prod.sync_type, free_space);
-
switch (r->prod.sync_type) {
case RTE_RING_SYNC_MT:
return rte_ring_mp_enqueue_bulk_elem(r, obj_table, esize, n,
case RTE_RING_SYNC_MT_RTS:
return rte_ring_mp_rts_enqueue_bulk_elem(r, obj_table, esize, n,
free_space);
+ case RTE_RING_SYNC_MT_HTS:
+ return rte_ring_mp_hts_enqueue_bulk_elem(r, obj_table, esize, n,
+ free_space);
#endif
}
case RTE_RING_SYNC_MT_RTS:
return rte_ring_mc_rts_dequeue_bulk_elem(r, obj_table, esize,
n, available);
+ case RTE_RING_SYNC_MT_HTS:
+ return rte_ring_mc_hts_dequeue_bulk_elem(r, obj_table, esize,
+ n, available);
#endif
}
* @return
* - n: Actual number of objects enqueued.
*/
-static __rte_always_inline unsigned
+static __rte_always_inline unsigned int
rte_ring_mp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
unsigned int esize, unsigned int n, unsigned int *free_space)
{
* @return
* - n: Actual number of objects enqueued.
*/
-static __rte_always_inline unsigned
+static __rte_always_inline unsigned int
rte_ring_sp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
unsigned int esize, unsigned int n, unsigned int *free_space)
{
* @return
* - n: Actual number of objects enqueued.
*/
-static __rte_always_inline unsigned
+static __rte_always_inline unsigned int
rte_ring_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
unsigned int esize, unsigned int n, unsigned int *free_space)
{
case RTE_RING_SYNC_MT_RTS:
return rte_ring_mp_rts_enqueue_burst_elem(r, obj_table, esize,
n, free_space);
+ case RTE_RING_SYNC_MT_HTS:
+ return rte_ring_mp_hts_enqueue_burst_elem(r, obj_table, esize,
+ n, free_space);
#endif
}
* @return
* - n: Actual number of objects dequeued, 0 if ring is empty
*/
-static __rte_always_inline unsigned
+static __rte_always_inline unsigned int
rte_ring_mc_dequeue_burst_elem(struct rte_ring *r, void *obj_table,
unsigned int esize, unsigned int n, unsigned int *available)
{
* @return
* - n: Actual number of objects dequeued, 0 if ring is empty
*/
-static __rte_always_inline unsigned
+static __rte_always_inline unsigned int
rte_ring_sc_dequeue_burst_elem(struct rte_ring *r, void *obj_table,
unsigned int esize, unsigned int n, unsigned int *available)
{
case RTE_RING_SYNC_MT_RTS:
return rte_ring_mc_rts_dequeue_burst_elem(r, obj_table, esize,
n, available);
+ case RTE_RING_SYNC_MT_HTS:
+ return rte_ring_mc_hts_dequeue_burst_elem(r, obj_table, esize,
+ n, available);
#endif
}
return 0;
}
+#ifdef ALLOW_EXPERIMENTAL_API
+#include <rte_ring_peek.h>
+#endif
+
#include <rte_ring.h>
#ifdef __cplusplus