ring: remove experimental flag from custom element API
[dpdk.git] / lib / librte_ring / rte_ring_elem.h
index 15d79bf..69dc517 100644 (file)
 extern "C" {
 #endif
 
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <sys/queue.h>
-#include <errno.h>
-#include <rte_common.h>
-#include <rte_config.h>
-#include <rte_memory.h>
-#include <rte_lcore.h>
-#include <rte_atomic.h>
-#include <rte_branch_prediction.h>
-#include <rte_memzone.h>
-#include <rte_pause.h>
-
-#include "rte_ring.h"
+#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
@@ -57,13 +40,9 @@ extern "C" {
  *   - -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
@@ -88,12 +67,30 @@ ssize_t rte_ring_get_memsize_elem(unsigned int esize, unsigned int count);
  *   constraint for the reserved zone.
  * @param flags
  *   An OR of the following:
- *    - RING_F_SP_ENQ: If this flag is set, the default behavior when
- *      using ``rte_ring_enqueue()`` or ``rte_ring_enqueue_bulk()``
- *      is "single-producer". Otherwise, it is "multi-producers".
- *    - RING_F_SC_DEQ: If this flag is set, the default behavior when
- *      using ``rte_ring_dequeue()`` or ``rte_ring_dequeue_bulk()``
- *      is "single-consumer". Otherwise, it is "multi-consumers".
+ *   - One of mutually exclusive flags that define producer behavior:
+ *      - RING_F_SP_ENQ: If this flag is set, the default behavior when
+ *        using ``rte_ring_enqueue()`` or ``rte_ring_enqueue_bulk()``
+ *        is "single-producer".
+ *      - 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_SC_DEQ: If this flag is set, the default behavior when
+ *        using ``rte_ring_dequeue()`` or ``rte_ring_dequeue_bulk()``
+ *        is "single-consumer". Otherwise, it is "multi-consumers".
+ *      - 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
  *   On success, the pointer to the new allocated ring. NULL on error with
  *    rte_errno set appropriately. Possible errno values include:
@@ -105,13 +102,12 @@ ssize_t rte_ring_get_memsize_elem(unsigned int esize, unsigned int count);
  *    - 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);
 
 static __rte_always_inline void
-enqueue_elems_32(struct rte_ring *r, const uint32_t size, uint32_t idx,
-               const void *obj_table, uint32_t n)
+__rte_ring_enqueue_elems_32(struct rte_ring *r, const uint32_t size,
+               uint32_t idx, const void *obj_table, uint32_t n)
 {
        unsigned int i;
        uint32_t *ring = (uint32_t *)&r[1];
@@ -153,14 +149,14 @@ enqueue_elems_32(struct rte_ring *r, const uint32_t size, uint32_t idx,
 }
 
 static __rte_always_inline void
-enqueue_elems_64(struct rte_ring *r, uint32_t prod_head,
+__rte_ring_enqueue_elems_64(struct rte_ring *r, uint32_t prod_head,
                const void *obj_table, uint32_t n)
 {
        unsigned int i;
        const uint32_t size = r->size;
        uint32_t idx = prod_head & r->mask;
        uint64_t *ring = (uint64_t *)&r[1];
-       const uint64_t *obj = (const uint64_t *)obj_table;
+       const unaligned_uint64_t *obj = (const unaligned_uint64_t *)obj_table;
        if (likely(idx + n < size)) {
                for (i = 0; i < (n & ~0x3); i += 4, idx += 4) {
                        ring[idx] = obj[i];
@@ -186,7 +182,7 @@ enqueue_elems_64(struct rte_ring *r, uint32_t prod_head,
 }
 
 static __rte_always_inline void
-enqueue_elems_128(struct rte_ring *r, uint32_t prod_head,
+__rte_ring_enqueue_elems_128(struct rte_ring *r, uint32_t prod_head,
                const void *obj_table, uint32_t n)
 {
        unsigned int i;
@@ -219,16 +215,16 @@ enqueue_elems_128(struct rte_ring *r, uint32_t prod_head,
  * single and multi producer enqueue functions.
  */
 static __rte_always_inline void
-enqueue_elems(struct rte_ring *r, uint32_t prod_head, const void *obj_table,
-               uint32_t esize, uint32_t num)
+__rte_ring_enqueue_elems(struct rte_ring *r, uint32_t prod_head,
+               const void *obj_table, uint32_t esize, uint32_t num)
 {
        /* 8B and 16B copies implemented individually to retain
         * the current performance.
         */
        if (esize == 8)
-               enqueue_elems_64(r, prod_head, obj_table, num);
+               __rte_ring_enqueue_elems_64(r, prod_head, obj_table, num);
        else if (esize == 16)
-               enqueue_elems_128(r, prod_head, obj_table, num);
+               __rte_ring_enqueue_elems_128(r, prod_head, obj_table, num);
        else {
                uint32_t idx, scale, nr_idx, nr_num, nr_size;
 
@@ -238,13 +234,14 @@ enqueue_elems(struct rte_ring *r, uint32_t prod_head, const void *obj_table,
                idx = prod_head & r->mask;
                nr_idx = idx * scale;
                nr_size = r->size * scale;
-               enqueue_elems_32(r, nr_size, nr_idx, obj_table, nr_num);
+               __rte_ring_enqueue_elems_32(r, nr_size, nr_idx,
+                               obj_table, nr_num);
        }
 }
 
 static __rte_always_inline void
-dequeue_elems_32(struct rte_ring *r, const uint32_t size, uint32_t idx,
-               void *obj_table, uint32_t n)
+__rte_ring_dequeue_elems_32(struct rte_ring *r, const uint32_t size,
+               uint32_t idx, void *obj_table, uint32_t n)
 {
        unsigned int i;
        uint32_t *ring = (uint32_t *)&r[1];
@@ -286,14 +283,14 @@ dequeue_elems_32(struct rte_ring *r, const uint32_t size, uint32_t idx,
 }
 
 static __rte_always_inline void
-dequeue_elems_64(struct rte_ring *r, uint32_t prod_head,
+__rte_ring_dequeue_elems_64(struct rte_ring *r, uint32_t prod_head,
                void *obj_table, uint32_t n)
 {
        unsigned int i;
        const uint32_t size = r->size;
        uint32_t idx = prod_head & r->mask;
        uint64_t *ring = (uint64_t *)&r[1];
-       uint64_t *obj = (uint64_t *)obj_table;
+       unaligned_uint64_t *obj = (unaligned_uint64_t *)obj_table;
        if (likely(idx + n < size)) {
                for (i = 0; i < (n & ~0x3); i += 4, idx += 4) {
                        obj[i] = ring[idx];
@@ -319,7 +316,7 @@ dequeue_elems_64(struct rte_ring *r, uint32_t prod_head,
 }
 
 static __rte_always_inline void
-dequeue_elems_128(struct rte_ring *r, uint32_t prod_head,
+__rte_ring_dequeue_elems_128(struct rte_ring *r, uint32_t prod_head,
                void *obj_table, uint32_t n)
 {
        unsigned int i;
@@ -348,16 +345,16 @@ dequeue_elems_128(struct rte_ring *r, uint32_t prod_head,
  * single and multi producer enqueue functions.
  */
 static __rte_always_inline void
-dequeue_elems(struct rte_ring *r, uint32_t cons_head, void *obj_table,
-               uint32_t esize, uint32_t num)
+__rte_ring_dequeue_elems(struct rte_ring *r, uint32_t cons_head,
+               void *obj_table, uint32_t esize, uint32_t num)
 {
        /* 8B and 16B copies implemented individually to retain
         * the current performance.
         */
        if (esize == 8)
-               dequeue_elems_64(r, cons_head, obj_table, num);
+               __rte_ring_dequeue_elems_64(r, cons_head, obj_table, num);
        else if (esize == 16)
-               dequeue_elems_128(r, cons_head, obj_table, num);
+               __rte_ring_dequeue_elems_128(r, cons_head, obj_table, num);
        else {
                uint32_t idx, scale, nr_idx, nr_num, nr_size;
 
@@ -367,7 +364,8 @@ dequeue_elems(struct rte_ring *r, uint32_t cons_head, void *obj_table,
                idx = cons_head & r->mask;
                nr_idx = idx * scale;
                nr_size = r->size * scale;
-               dequeue_elems_32(r, nr_size, nr_idx, obj_table, nr_num);
+               __rte_ring_dequeue_elems_32(r, nr_size, nr_idx,
+                               obj_table, nr_num);
        }
 }
 
@@ -392,7 +390,7 @@ dequeue_elems(struct rte_ring *r, uint32_t cons_head, void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -424,7 +422,7 @@ __rte_ring_do_enqueue_elem(struct rte_ring *r, const void *obj_table,
        if (n == 0)
                goto end;
 
-       enqueue_elems(r, prod_head, obj_table, esize, n);
+       __rte_ring_enqueue_elems(r, prod_head, obj_table, esize, n);
 
        update_tail(&r->prod, prod_head, prod_next, is_sp, 1);
 end:
@@ -439,7 +437,7 @@ end:
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -471,7 +469,7 @@ __rte_ring_do_dequeue_elem(struct rte_ring *r, void *obj_table,
        if (n == 0)
                goto end;
 
-       dequeue_elems(r, cons_head, obj_table, esize, n);
+       __rte_ring_dequeue_elems(r, cons_head, obj_table, esize, n);
 
        update_tail(&r->cons, cons_head, cons_next, is_sc, 0);
 
@@ -490,7 +488,7 @@ end:
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -508,7 +506,7 @@ rte_ring_mp_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, __IS_MP, free_space);
+                       RTE_RING_QUEUE_FIXED, RTE_RING_SYNC_MT, free_space);
 }
 
 /**
@@ -519,7 +517,7 @@ rte_ring_mp_enqueue_bulk_elem(struct rte_ring *r, const void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -537,9 +535,14 @@ rte_ring_sp_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, __IS_SP, free_space);
+                       RTE_RING_QUEUE_FIXED, RTE_RING_SYNC_ST, free_space);
 }
 
+#ifdef ALLOW_EXPERIMENTAL_API
+#include <rte_ring_hts.h>
+#include <rte_ring_rts.h>
+#endif
+
 /**
  * Enqueue several objects on a ring.
  *
@@ -550,7 +553,7 @@ rte_ring_sp_enqueue_bulk_elem(struct rte_ring *r, const void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -567,8 +570,28 @@ static __rte_always_inline unsigned int
 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.single, free_space);
+       switch (r->prod.sync_type) {
+       case RTE_RING_SYNC_MT:
+               return rte_ring_mp_enqueue_bulk_elem(r, obj_table, esize, n,
+                       free_space);
+       case RTE_RING_SYNC_ST:
+               return rte_ring_sp_enqueue_bulk_elem(r, obj_table, esize, n,
+                       free_space);
+#ifdef ALLOW_EXPERIMENTAL_API
+       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
+       }
+
+       /* valid ring should never reach this point */
+       RTE_ASSERT(0);
+       if (free_space != NULL)
+               *free_space = 0;
+       return 0;
 }
 
 /**
@@ -655,7 +678,7 @@ rte_ring_enqueue_elem(struct rte_ring *r, void *obj, unsigned int esize)
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects) that will be filled.
+ *   A pointer to a table of objects that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -673,7 +696,7 @@ rte_ring_mc_dequeue_bulk_elem(struct rte_ring *r, void *obj_table,
                unsigned int esize, unsigned int n, unsigned int *available)
 {
        return __rte_ring_do_dequeue_elem(r, obj_table, esize, n,
-                               RTE_RING_QUEUE_FIXED, __IS_MC, available);
+                       RTE_RING_QUEUE_FIXED, RTE_RING_SYNC_MT, available);
 }
 
 /**
@@ -682,7 +705,7 @@ rte_ring_mc_dequeue_bulk_elem(struct rte_ring *r, void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects) that will be filled.
+ *   A pointer to a table of objects that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -701,7 +724,7 @@ rte_ring_sc_dequeue_bulk_elem(struct rte_ring *r, void *obj_table,
                unsigned int esize, unsigned int n, unsigned int *available)
 {
        return __rte_ring_do_dequeue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_FIXED, __IS_SC, available);
+                       RTE_RING_QUEUE_FIXED, RTE_RING_SYNC_ST, available);
 }
 
 /**
@@ -714,7 +737,7 @@ rte_ring_sc_dequeue_bulk_elem(struct rte_ring *r, void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects) that will be filled.
+ *   A pointer to a table of objects that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -731,8 +754,28 @@ static __rte_always_inline unsigned int
 rte_ring_dequeue_bulk_elem(struct rte_ring *r, void *obj_table,
                unsigned int esize, unsigned int n, unsigned int *available)
 {
-       return __rte_ring_do_dequeue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_FIXED, r->cons.single, available);
+       switch (r->cons.sync_type) {
+       case RTE_RING_SYNC_MT:
+               return rte_ring_mc_dequeue_bulk_elem(r, obj_table, esize, n,
+                       available);
+       case RTE_RING_SYNC_ST:
+               return rte_ring_sc_dequeue_bulk_elem(r, obj_table, esize, n,
+                       available);
+#ifdef ALLOW_EXPERIMENTAL_API
+       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
+       }
+
+       /* valid ring should never reach this point */
+       RTE_ASSERT(0);
+       if (available != NULL)
+               *available = 0;
+       return 0;
 }
 
 /**
@@ -744,7 +787,7 @@ rte_ring_dequeue_bulk_elem(struct rte_ring *r, void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_p
- *   A pointer to a void * pointer (object) that will be filled.
+ *   A pointer to the object that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -768,7 +811,7 @@ rte_ring_mc_dequeue_elem(struct rte_ring *r, void *obj_p,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_p
- *   A pointer to a void * pointer (object) that will be filled.
+ *   A pointer to the object that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -796,7 +839,7 @@ rte_ring_sc_dequeue_elem(struct rte_ring *r, void *obj_p,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_p
- *   A pointer to a void * pointer (object) that will be filled.
+ *   A pointer to the object that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -822,7 +865,7 @@ rte_ring_dequeue_elem(struct rte_ring *r, void *obj_p, unsigned int esize)
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -835,12 +878,12 @@ rte_ring_dequeue_elem(struct rte_ring *r, void *obj_p, unsigned int esize)
  * @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 __rte_ring_do_enqueue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_VARIABLE, __IS_MP, free_space);
+                       RTE_RING_QUEUE_VARIABLE, RTE_RING_SYNC_MT, free_space);
 }
 
 /**
@@ -851,7 +894,7 @@ rte_ring_mp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -864,12 +907,12 @@ rte_ring_mp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
  * @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 __rte_ring_do_enqueue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_VARIABLE, __IS_SP, free_space);
+                       RTE_RING_QUEUE_VARIABLE, RTE_RING_SYNC_ST, free_space);
 }
 
 /**
@@ -882,7 +925,7 @@ rte_ring_sp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects).
+ *   A pointer to a table of objects.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -895,12 +938,32 @@ rte_ring_sp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
  * @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)
 {
-       return __rte_ring_do_enqueue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_VARIABLE, r->prod.single, free_space);
+       switch (r->prod.sync_type) {
+       case RTE_RING_SYNC_MT:
+               return rte_ring_mp_enqueue_burst_elem(r, obj_table, esize, n,
+                       free_space);
+       case RTE_RING_SYNC_ST:
+               return rte_ring_sp_enqueue_burst_elem(r, obj_table, esize, n,
+                       free_space);
+#ifdef ALLOW_EXPERIMENTAL_API
+       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
+       }
+
+       /* valid ring should never reach this point */
+       RTE_ASSERT(0);
+       if (free_space != NULL)
+               *free_space = 0;
+       return 0;
 }
 
 /**
@@ -914,7 +977,7 @@ rte_ring_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects) that will be filled.
+ *   A pointer to a table of objects that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -927,12 +990,12 @@ rte_ring_enqueue_burst_elem(struct rte_ring *r, const void *obj_table,
  * @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 __rte_ring_do_dequeue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_VARIABLE, __IS_MC, available);
+                       RTE_RING_QUEUE_VARIABLE, RTE_RING_SYNC_MT, available);
 }
 
 /**
@@ -943,7 +1006,7 @@ rte_ring_mc_dequeue_burst_elem(struct rte_ring *r, void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects) that will be filled.
+ *   A pointer to a table of objects that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -956,12 +1019,12 @@ rte_ring_mc_dequeue_burst_elem(struct rte_ring *r, void *obj_table,
  * @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)
 {
        return __rte_ring_do_dequeue_elem(r, obj_table, esize, n,
-                       RTE_RING_QUEUE_VARIABLE, __IS_SC, available);
+                       RTE_RING_QUEUE_VARIABLE, RTE_RING_SYNC_ST, available);
 }
 
 /**
@@ -974,7 +1037,7 @@ rte_ring_sc_dequeue_burst_elem(struct rte_ring *r, void *obj_table,
  * @param r
  *   A pointer to the ring structure.
  * @param obj_table
- *   A pointer to a table of void * pointers (objects) that will be filled.
+ *   A pointer to a table of objects that will be filled.
  * @param esize
  *   The size of ring element, in bytes. It must be a multiple of 4.
  *   This must be the same value used while creating the ring. Otherwise
@@ -991,11 +1054,36 @@ static __rte_always_inline unsigned int
 rte_ring_dequeue_burst_elem(struct rte_ring *r, void *obj_table,
                unsigned int esize, unsigned int n, unsigned int *available)
 {
-       return __rte_ring_do_dequeue_elem(r, obj_table, esize, n,
-                               RTE_RING_QUEUE_VARIABLE,
-                               r->cons.single, available);
+       switch (r->cons.sync_type) {
+       case RTE_RING_SYNC_MT:
+               return rte_ring_mc_dequeue_burst_elem(r, obj_table, esize, n,
+                       available);
+       case RTE_RING_SYNC_ST:
+               return rte_ring_sc_dequeue_burst_elem(r, obj_table, esize, n,
+                       available);
+#ifdef ALLOW_EXPERIMENTAL_API
+       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
+       }
+
+       /* valid ring should never reach this point */
+       RTE_ASSERT(0);
+       if (available != NULL)
+               *available = 0;
+       return 0;
 }
 
+#ifdef ALLOW_EXPERIMENTAL_API
+#include <rte_ring_peek.h>
+#endif
+
+#include <rte_ring.h>
+
 #ifdef __cplusplus
 }
 #endif