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 ...
随机推荐
- VirtWire 向客服发ticket
1 首先需要登录自己的账户 2 点击网页的Open Ticket 3 选择要发送何种类型的ticket 4 写自己的问题,包括一个合适的主题,选择你发ticket是针对哪个vps(一个账户下可以ord ...
- [CSAcademy]Sum of Powers
[CSAcademy]Sum of Powers 题目大意: 给定\(n,m,k(n,m,k\le4096)\).一个无序可重集\(A\)为合法的,当且仅当\(|A|=m\)且\(\sum A_i=n ...
- Tensorflow显示图片
Tensorflow在处理数据时,经常加载图像数据,有的时候是直接读取文件,有的则是读取二进制文件,为了更好的理解Tensorflow数据处理模式,先简单讲解显示图片机制,就能更好掌握是否读取正确了. ...
- ReactNative用指定的设备/模拟器运行项目
命令行中React native项目目录下键入react-native run-ios会启动iOS模拟器, 默认是使用iPhone6,如果想要试用其他版本的模拟器则需要在react-native ru ...
- js中函数对象创建的总结
在JavaScript的函数对象创建方法中,可以分为三种情况: 1:第一种是使用function语句定义函数 <script type="text/javascript"&g ...
- Django中提供的6种缓存方式
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- Django深度剖析-二
WEBserver处理过程 先写个大家熟悉的socketserver例子 #! /usr/bin/env python # encoding: utf-8 """ @Au ...
- vs 2017 community中文版下载地址
https://my.visualstudio.com/Downloads?pid=2190 SHA1: 109C6646A79844D8116DADB293A0B64754363C69 File n ...
- Java操作Linuxshell并且获取返回值
/** * */package com.king.weixin.util;import java.io.BufferedReader;import java.io.InputStream;/*** @ ...
- 修改MySql数据库的默认时
MySql数据库创建后,默认的时区比东八区少了八个小时.如果Sql语句中使用到MySql的时间的话就会比正常时间少了八个小时.所以需要修改MySql的系统时区,使其显示的时间和我们现在的时间一致. 1 ...