FIFO(first in first out)先进先出的存储结构。和ring队列结构一样,区别是fifo支持动态扩展存储区大小。也是支持任意数据类型。处理逻辑和ring队列差不多。
相关代码在src/vppinfra/fifo.【ch】文件,代码总共也不到500H。
typedef struct
{
/* First index of valid data in fifo. */
u32 head_index;
/* One beyond last index in fifo. */
u32 tail_index;
} clib_fifo_header_t;
head_index : fifo中有效数据的第一个索引
tail_index: fifo中尾部元素索引,表示下一个可加数据的索引。这个不要理解错了。我们可以通过函数获取fifo有效元素个数可以确认。
always_inline uword
clib_fifo_elts (void *v)
{
word l, r;
clib_fifo_header_t *f = clib_fifo_header (v);
if (!v)
return 0;
l = _clib_fifo_len (v);
r = (word) f->tail_index - (word) f->head_index;
r = r < 0 ? r + l : r;
ASSERT (r >= 0 && r <= l);
return r;
}
typedef struct { int a, b; } T;
T * f = 0;
2、filo中添加元素,有三种方式
#1 给定元素X,添加到fifo中
T x;
x.a = 10; x.b = 20;
fifo_add1 (f, x);
#2 批量添加元素。
T buf[10];
initialize buf[0] .. buf[9];
fifo_add (f, buf, 10);
#3 添加1个元素,返回对应的指针,并对元素赋值。
T * x;
fifo_add2 (f, x);
x->a = 10;
x->b = 20;
3、 从fifo中删除元素
T x;
fifo_sub1 (f, x);
4、释放
fifo_free (f)
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!