Kfifo是Linux内核缓冲队列
#include <linux/kfifo.h> 分配kfifo队列,返回值为0表示成功,其他值表示失败 int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask); size大小为2的幂次方 gfp_mask一般为GFP_KERNEL 释放kfifo队列 #define kfifo_free(fifo) ({ typeof((fifo) + 1) __tmp = (fifo); struct __kfifo *__kfifo = &__tmp->kfifo; if (__is_kfifo_ptr(__tmp)) __kfifo_free(__kfifo); }) 初始化kfifo队列 #define kfifo_init(fifo, buffer, size) ({ typeof((fifo) + 1) __tmp = (fifo); struct __kfifo *__kfifo = &__tmp->kfifo; __is_kfifo_ptr(__tmp) ? __kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : -EINVAL; }) 入kfifo队列 #define kfifo_in(fifo, buf, n) ({ typeof((fifo) + 1) __tmp = (fifo); typeof(__tmp->ptr_const) __buf = (buf); unsigned long __n = (n); const size_t __recsize = sizeof(*__tmp->rectype); struct __kfifo *__kfifo = &__tmp->kfifo; (__recsize) ? __kfifo_in_r(__kfifo, __buf, __n, __recsize) : __kfifo_in(__kfifo, __buf, __n); }) 出kfifo队列 #define kfifo_out(fifo, buf, n) __kfifo_uint_must_check_helper( ({ typeof((fifo) + 1) __tmp = (fifo); typeof(__tmp->ptr) __buf = (buf); unsigned long __n = (n); const size_t __recsize = sizeof(*__tmp->rectype); struct __kfifo *__kfifo = &__tmp->kfifo; (__recsize) ? __kfifo_out_r(__kfifo, __buf, __n, __recsize) : __kfifo_out(__kfifo, __buf, __n); }) )
获取kfifo空间大小,返回字节数
#define kfifo_size(fifo) ((fifo)->kfifo.mask + 1)
获取kfifo已使用空间,返回已使用字节数
#define kfifo_len(fifo)
({
typeof((fifo) + 1) __tmpl = (fifo);
__tmpl->kfifo.in - __tmpl->kfifo.out;
})
获取kfifo可用空间,返回可用字节数
#define kfifo_avail(fifo)
__kfifo_uint_must_check_helper(
({
typeof((fifo) + 1) __tmpq = (fifo);
const size_t __recsize = sizeof(*__tmpq->rectype);
unsigned int __avail = kfifo_size(__tmpq) - kfifo_len(__tmpq);
(__recsize) ? ((__avail <= __recsize) ? 0 :
__kfifo_max_r(__avail - __recsize, __recsize)) :
__avail;
})
)
检查kfifo是否为空,如果为空,返回true
#define kfifo_is_empty(fifo)
({
typeof((fifo) + 1) __tmpq = (fifo);
__tmpq->kfifo.in == __tmpq->kfifo.out;
})
检查kfifo是否已满,如果已满,返回true
#define kfifo_is_full(fifo)
({
typeof((fifo) + 1) __tmpq = (fifo);
kfifo_len(__tmpq) > __tmpq->kfifo.mask;
})
清空kfifo
#define kfifo_reset(fifo)
(void)({
typeof((fifo) + 1) __tmp = (fifo);
__tmp->kfifo.in = __tmp->kfifo.out = 0;
})