首先说明下几个关键指针:
r->prod.head:接下来开始进行入队的位置;
r->prod.tail:已经入队完成的位置;
若r->prod.head > r->prod.tail,说明有core正在执行入队操作,两者相等时说明入队完成;
r->cons.head:接下来开始进行出队的位置;
r->cons.tail:出队已完成的位置;
若 r->cons.head > r->cons.tail,说明有core正在执行出队操作,两者相等时说明出队完成;
以DPDK的入队为例进行介绍:
static __rte_always_inline unsigned int
__rte_ring_do_enqueue(struct rte_ring *r, void * const *obj_table,
unsigned int n, enum rte_ring_queue_behavior behavior,
unsigned int is_sp, unsigned int *free_space)