vppinfra ring是基于vector实现的环形队列,不支持多线程,不支持动态扩展。代码只有短短的125行左右。代码位置:srcvppinfraring.h
- ring结构体描述
typedef struct
{
u32 next, n_enq;
} clib_ring_header_t;
ring 头只有2个元素,具体描述如下:
next : ring队列中下一个放置元素的slot号。
n_enq : ring中存储的元素数量。
ring队列长度是通过vec_len(ring)来得到的。
- ring内存分布
ring内存分布还是比较简单的,如下:
ring操作函数
ring操作函数一共就8个,也是非常简洁高效的。
入队时需要注意,因为ring是不支持动态扩展的,所以当前ring满时,会返回NULL。
出队时也一样,当ring队列为空时,也返回NULL。否则返回元素指针。
代码语言:javascript复制always_inline void *
clib_ring_get_last_inline (void *v, u32 elt_bytes, int enqueue)
{
clib_ring_header_t *h = clib_ring_header (v);
u32 slot;
if (enqueue)
{
if (h->n_enq == _vec_len (v))
return 0;
slot = h->next;
h->n_enq ;
h->next ;
if (h->next == _vec_len (v))
h->next = 0;
}
else
{
if (h->n_enq == 0)
return 0;
slot = h->next == 0 ? _vec_len (v) - 1 : h->next - 1;
}
return (void *) ((u8 *) v elt_bytes * slot);
}
总结
ring函数实现是比较简单的,自己可以去阅读代码。