vppinfra ---ring理解

2023-03-07 17:00:52 浏览数 (2)

vppinfra ring是基于vector实现的环形队列,不支持多线程,不支持动态扩展。代码只有短短的125行左右。代码位置:srcvppinfraring.h

  • ring结构体描述
代码语言:javascript复制
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函数实现是比较简单的,自己可以去阅读代码。

0 人点赞