zoukankan      html  css  js  c++  java
  • 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;
    })

  • 相关阅读:
    IPC之msgutil.c源码解读
    IPC之msg.c源码解读
    IPC之mqueue.c源码解读
    从锅炉工到AI专家(10)
    从锅炉工到AI专家(9)
    从锅炉工到AI专家(8)
    从锅炉工到AI专家(7)
    从锅炉工到AI专家(6)
    从锅炉工到AI专家(5)
    从锅炉工到AI专家(4)
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/10694511.html
Copyright © 2011-2022 走看看