Hi,
On 08/04/2015 04:20 AM, Yan, Liming (Nokia - CN/Hangzhou) wrote: > Hi, > As we see, DPDK ring has mainly the enqueue/dequeue APIs for SINGLE/MULTI > producer/consumer. I have a requirement in work to take a peek on the top > object in the ring. I don't want to consume it, just check the reference of > the object. How could this be supported? Or any alternative solution for > my requirement? Thanks. > I wrote my own simple peek interface but it's not MC-safe. I think it's > better if DPDK can support it officially. I think it's a good idea. I think we could avoid a test by using the same naming convention than other functions applying to single consumer rings. I'm not sure the function is safe on mc rings: the pointer returned via peek() should not be accessed while another core dequeues the object and modify/free it. A simplified version would be something like that: /** * Peek one object from a single-consumer ring * * The returned object is not dequeued. This function does not work * on a multi-consumers ring. * * @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; objects dequeued. * - -ENOENT: Not enough entries in the ring to peek */ static inline int rte_ring_sc_peek(struct rte_ring *r, void **obj_p) { if (unlikely(rte_ring_empty(r))) return -ENOENT; *obj_p = r->ring[r->cons.head & r->prod.mask]; return 0; } Regards, Olivier > > > /** > + * Just take a peek on the top object from a ring but not consume it. > + * Note: This interface is MC and multi-thread not safe. > + * It can only be used for ring with RING_F_SC_DEQ attribute. > + * > + * @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 is peeked. > + * - -ENOENT: Not entries in the ring. > + * - - EPERM: Operation not permitted/supported > + */ > +static inline int __attribute__((always_inline)) > +rte_ring_peek(const struct rte_ring *r, void **obj_p) > +{ > + uint32_t cons_head, prod_tail; > + > + if (r->cons.sc_dequeue) { > + cons_head = r->cons.head; > + prod_tail = r->prod.tail; > + > + if (prod_tail - cons_head == 0) { > + return -ENOENT; > + } > + *obj_p = r->ring[cons_head & r->prod.mask]; > + } else { > + return -EPERM; > + } > + return 0; > +} > + > +/** > > > --------^_^-------- > Best Regards > Yan Limin > >