Sword 内核队列二
#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 内核队列二的更多相关文章
- Sword 内核队列一
1.gfifo概述 gfifo是一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只 ...
- linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)
一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...
- SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...
- (笔记)Linux内核学习(二)之进程
一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对 ...
- Android组件内核之Fragment管理与内核(二)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Fragment管理与内核: [Fragm ...
- 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; ...
- ActiveMQ_点对点队列(二)
一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式 二.配置信息 1 ...
- linux内核系列(二)内核数据结构之链表
双向链表 传统链表与linu内核链表的区别图: 图一 图二 从上图中看出在传统链表中各种不同链表间没有通用性,因为各个数据域不同,而在linux内核中巧妙将链表结构内嵌到数据域结构中使得不同结构之间能 ...
- RabbitMQ 消息队列 二
一:查看MQ的用户角色 rabbitmqctl list_users 二:添加新的角色,并授予权限 rabbitmqctl add_user xiaoyao 123456 rabbitmqctl se ...
随机推荐
- 潭州课堂25班:Ph201805201 django 项目 第五课 静态页面转为模板 (课堂笔记)
一.分析静态页面 1.静态vs动态 条目 静态页面 动态页面 网站内容 固定不变 经常变动 浏览器加载速度 更快(无需向服务器发起请求) 更慢 改变网站内容 很难(修改或者创建新的html页面) ...
- 使用scrapy爬取百度股票
1.spiders文件夹下的爬虫文件 # -*- coding: utf-8 -*- import scrapy import re import random from scrapy.http.re ...
- C#中Key事件
在键盘按下键然后释放的过程中有3个事件发生,分别为KeyDown事件.KeyPress事件和KeyUp事件. KeyDown和KeyUp事件让应用程序捕捉用户在键盘上按下的特殊键或某些特定键甚至组合键 ...
- ssm框架出现的常见问题
1:自己写的代码测试的时候显示用户过期,需要释放拦截器,并配置权限允许 2:Servlet.service() for servlet [springmvc] in context with path ...
- Android 去除应用标题栏(Android Studio)
修改styles.xml文件 <resources> <!-- Base application theme. --> <style name="AppThem ...
- 一个封装不错的 TcpClient 类
using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading; nam ...
- js中字符串的方法
js String对象中常用方法小结,需要的朋友可以参考下: 1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: ...
- 尚未备份数据库 "***" 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。
使用SQL Server 2005还原备份的数据库文件时出现的问题,如题. 前提:如果你有个数据库的.bak的备份文件. 右键点击 数据库任务-->还原-->数据库 1.还原的目标选择你要 ...
- java.lang.NumberFormatException: multiple points错误问题
最近项目一直会出现时间转换报错,一直不知道是什么问题??? java.lang.NumberFormatException: multiple points at sun.misc.Float ...
- 树莓派raspberry pi配置无线路由器AP
raspi-config进入系统配置面板 进行 Expand Filesystem 扩展文件系统否则备份系统的时候备份文件会急速膨胀. (1)配置网络环境nano /etc/network/inte ...