• Linux驱动开发9——kfifo缓冲队列


    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;
    })

  • 相关阅读:
    批处理 星号的替换
    1.1.1 Windows系统内置工具——ipconfig
    2.1 以太网回顾
    书面实验1.3 识别冲突域和广播域
    书面实验1.1:OSI问题
    1.3 OSI模型
    1.2 网络互联模型
    1.1
    如何开启系统服务
    如何查看或启用打开windows功能
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/10694511.html
Copyright © 2020-2023  润新知