#ifndef __GTC_FIFO_H_
#define __GTC_FIFO_H_ #ifndef GTC_MAX
#define GTC_MAX(a,b) ((a) > (b) ? (a) : (b))
#endif #ifndef GTC_MIN
#define GTC_MIN(a,b) ((a) < (b) ? (a) : (b))
#endif #ifdef __cplusplus
extern "C"
{
#endif struct gfifo {
unsigned char *buffer; /* the buffer holding the data */
unsigned int size; /* the size of the allocated buffer */
unsigned int in; /* data is added at offset (in % size) */
unsigned int out; /* data is extracted from off. (out % size) */
}; //队列初始化
int gfifo_alloc(struct gfifo *fifo, unsigned int size); //压入队列
unsigned int gfifo_put(struct gfifo *fifo, const unsigned char *buffer, unsigned int len); //弹出队列
unsigned int gfifo_get(struct gfifo *fifo, unsigned char *buffer, unsigned int len); #ifdef __cplusplus
}
#endif #endif
#include "gfifo.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h> /********************************************************
Func Name: gfifo_init
Date Created: 2019-4-1
Description: 初始化
Input:
Output:
Return:
Caution:
*********************************************************/
static void gfifo_init(struct gfifo *fifo, void *buffer, unsigned int size)
{
fifo->buffer = buffer;
fifo->size = size;
fifo->in = ;
fifo->out = ;
} /********************************************************
Func Name: gfifo_roundup
Date Created: 2019-4-1
Description: 扩展
Input:
Output:
Return: size
Caution:
*********************************************************/
static unsigned int gfifo_roundup(unsigned int x)
{
unsigned int i = ;
unsigned int y = ; if (!x)
{
return ;
} for (i = x; i != ; )
{
i >>= ;
y <<= ;
} return y; } /********************************************************
Func Name: gfifo_alloc
Date Created: 2019-4-1
Description: 内存分配
Input:
Output:
Return: error code
Caution:
*********************************************************/
int gfifo_alloc(struct gfifo *fifo, unsigned int size)
{
assert(fifo); unsigned char *buffer; /*
size的值总是在调用者传进来的size参数的基础上向2的幂扩展,这是内核一贯的做法。
这样的好处不言而喻--对kfifo->size取模运算可以转化为与运算,如下:
fifo->in % fifo->size 可以转化为 fifo->in & (fifo->size – 1)
在kfifo_alloc函数中,使用size & (size – 1)来判断size 是否为2幂,如果条件为真,则表示size不是2的幂,然后调用roundup_pow_of_two将之向上扩展为2的幂。
*/
if (size & (size - ))
{
size = gfifo_roundup(size);
} buffer = calloc(, size);
if (NULL == buffer)
{
return -;
} gfifo_init(fifo, buffer, size); return ;
} /********************************************************
Func Name: gfifo_put
Date Created: 2019-4-1
Description: 压入队列
Input:
Output:
Return: 压入队列数据长度
Caution:
*********************************************************/
unsigned int gfifo_put(struct gfifo *fifo, const unsigned char *buffer, unsigned int len)
{
unsigned int left_over = ; /*
计算出实际写入队列数据大小
(fifo->in - fifo->out) 已经使用空间大小
fifo->size - (fifo->in - fifo->out) 可以使用空间大小
len 需要写入数据大小
*/
len = GTC_MIN(len, fifo->size - (fifo->in - fifo->out)); /*
计算出在队列in后面插入数据的大小
fifo->in & (fifo->size - 1) 等同于 fifo->in % fifo->size
fifo->size - (fifo->in & (fifo->size - 1)) 表示in后面可写数据的长度
*/
left_over = GTC_MIN(len, fifo->size - (fifo->in & (fifo->size - ))); //拷贝数据到in后面
memcpy(fifo->buffer + (fifo->in & (fifo->size - )), buffer, left_over); //将剩余的数据拷贝到out前面
memcpy(fifo->buffer, buffer + left_over, len - left_over); //更新in
fifo->in += len; return len;
} /********************************************************
Func Name: gfifo_get
Date Created: 2019-4-1
Description: 弹出队列
Input:
Output:
Return: 弹出队列
Caution:
*********************************************************/
unsigned int gfifo_get(struct gfifo *fifo, unsigned char *buffer, unsigned int len)
{
assert(buffer); unsigned int readable_length = ; /*
计算出实际可读队列数据大小
(fifo->in - fifo->out) 已经使用空间大小
*/ len = GTC_MIN(len, fifo->in - fifo->out); /*
计算出在队列out后面插入数据的大小
fifo->in & (fifo->size - 1) 等同于 fifo->in % fifo->size
fifo->size - (fifo->out & (fifo->size - 1)) 表示out后面可读数据的长度
*/
readable_length = GTC_MIN(len, fifo->size - (fifo->out & (fifo->size - ))); //拷贝数据
memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - )), readable_length); //拷贝能从头部获取的数据
memcpy(buffer + readable_length, fifo->buffer, len - readable_length); //更新out
fifo->out += len; return len;
}

Sword 内核队列二的更多相关文章

  1. Sword 内核队列一

    1.gfifo概述 gfifo是一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只 ...

  2. linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)

    一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...

  3. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  4. (笔记)Linux内核学习(二)之进程

    一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对 ...

  5. Android组件内核之Fragment管理与内核(二)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Fragment管理与内核: [Fragm ...

  6. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值

    原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) {    echo $var; ...

  7. ActiveMQ_点对点队列(二)

      一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式   二.配置信息 1 ...

  8. linux内核系列(二)内核数据结构之链表

    双向链表 传统链表与linu内核链表的区别图: 图一 图二 从上图中看出在传统链表中各种不同链表间没有通用性,因为各个数据域不同,而在linux内核中巧妙将链表结构内嵌到数据域结构中使得不同结构之间能 ...

  9. RabbitMQ 消息队列 二

    一:查看MQ的用户角色 rabbitmqctl list_users 二:添加新的角色,并授予权限 rabbitmqctl add_user xiaoyao 123456 rabbitmqctl se ...

随机推荐

  1. JavaScript基础笔记(十四)最佳实践

    最佳实践 一)松散耦合 1.解耦HTML/JavaScript: 1)避免html种使用js 2)避免js种创建html 2.解耦CSS/JS 操作类 3.解耦应用逻辑和事件处理 以下是要牢记的应用和 ...

  2. 潭州课堂25班:Ph201805201 django 项目 第二十六课 docker简介 (课堂笔记)

    官方文档: https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository 1,更新下sudo apt-ge ...

  3. 面试题fugui02

    一.概念题 1.描述对super.pass.yield.lambda关键字修饰的理解 2.大致描述一下python GIL的机制,以及python中多线程和多进程的区别 GIL全局解释器锁,是pyth ...

  4. Ghostscript 将PDF文件转换成PNG图片 问题一二

    由于项目需求,需要将原来的PDF文档转换成图片文件,在网上找了一些PDF转图片的方法:测试了几个后,都有这样或那样的问题 1.PDFLibNet.dll,这个类型最初还是挺好用的,能转图片和HTML, ...

  5. 用canvas整个打飞机游戏

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 之前在当耐特的DEMO里看到个打飞机的游戏,然后就把他的图片和音频扒了了下来....自己凭着玩的心情重新写了一个.仅供娱乐哈......我 ...

  6. Android style 继承

    style作用在单个视图或控件上,抽取共有的属性,实现复用. style的继承有两种方式: 通过parent标识父style <style name="GreenText" ...

  7. 初学JDBC的一些总结(一)

    1.关于JDBC的的个人理解: JDBC(Java Data Base Connectivity,java 数据库连接)是用于执行 SQL 语句的 JavaAPI,可以为多种关系型数据库提供统一的访问 ...

  8. Windows平台下SVN安装配置及使用

    原文链接:https://www.cnblogs.com/snake-hand/archive/2013/06/09/3130022.html,等有空了玩一玩吧,现在没空.

  9. 几个例子弄懂JS 的setTimeout的运行方式

                        function test() {   var a = 1;   setTimeout(function() {     alert(a);     a = 5 ...

  10. 【转】Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)

    本文转自:http://www.wjdiankong.cn/wireshark%E5%92%8Cfiddler%E5%88%86%E6%9E%90android%E4%B8%AD%E7%9A%84tl ...