数据结构:内核kfifo的实践

        实践了内核的数据结构kfifo记录下,其特点分析看了下这篇博客写的很详细。https://blog.csdn.net/zhoutaopower/article/details/86491852

fifo.c 实现kfifo的主干函数接口,但是很多有用的接口没有扩展,需要的时候再扩展。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include"fifo.h"#define min(a, b)              \
({                             \typeof(a) _a = (a);        \typeof(b) _b = (b);        \_a <= _b ? _a : _b         \
})static inline int fls(int x)
{int position;int i;if(0 != x){for(i = (x >> 1), position = 0; i != 0; ++position)i >>= 1;}else{position = -1;}return position+1;
}static inline unsigned int roundup_pow_of_two(unsigned int x)
{return 1UL << fls(x - 1);
}int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, size_t esize)
{/** round up to the next power of 2, since our 'let the indices* wrap' technique works only in this case.*/size = roundup_pow_of_two(size);fifo->in = 0;fifo->out = 0;fifo->esize = esize;if (size < 2) {fifo->data = NULL;fifo->mask = 0;return -1;}//      fifo->data = kmalloc_array(esize, size, gfp_mask);fifo->data = malloc(esize*size);if (!fifo->data) {fifo->mask = 0;return -1;}fifo->mask = size - 1;return 0;
}int __kfifo_init(struct __kfifo *fifo, void *buffer, unsigned int size, size_t esize)
{size /= esize;size = roundup_pow_of_two(size);fifo->in = 0;fifo->out = 0;fifo->esize = esize;fifo->data = buffer;if (size < 2) {fifo->mask = 0;return -1;}fifo->mask = size - 1;return 0;
}void __kfifo_free(struct __kfifo *fifo)
{free(fifo->data);fifo->in = 0;fifo->out = 0;fifo->esize = 0;fifo->data = NULL;fifo->mask = 0;
}/** internal helper to calculate the unused elements in a fifo*/
static inline unsigned int kfifo_unused(struct __kfifo *fifo)
{return (fifo->mask + 1) - (fifo->in - fifo->out);
}static void kfifo_copy_in(struct __kfifo *fifo, const void *src, unsigned int len, unsigned int off)
{unsigned int size = fifo->mask + 1;unsigned int esize = fifo->esize;unsigned int l;off &= fifo->mask;if (esize != 1) {off *= esize;size *= esize;len *= esize;}l = min(len, size - off);memcpy(fifo->data + off, src, l);memcpy(fifo->data, src + l, len - l);/** make sure that the data in the fifo is up to date before* incrementing the fifo->in index counter*/
//      smp_wmb();
}unsigned int __kfifo_in(struct __kfifo *fifo, const void *buf, unsigned int len)
{unsigned int l;l = kfifo_unused(fifo);if (len > l)len = l;kfifo_copy_in(fifo, buf, len, fifo->in);fifo->in += len;return len;
}static void kfifo_copy_out(struct __kfifo *fifo, void *dst,unsigned int len, unsigned int off)
{unsigned int size = fifo->mask + 1;unsigned int esize = fifo->esize;unsigned int l;off &= fifo->mask;if (esize != 1) {off *= esize;size *= esize;len *= esize;}l = min(len, size - off);memcpy(dst, fifo->data + off, l);memcpy(dst + l, fifo->data, len - l);/** make sure that the data is copied before* incrementing the fifo->out index counter*/
//      smp_wmb();
}unsigned int __kfifo_out_peek(struct __kfifo *fifo,void *buf, unsigned int len)
{unsigned int l;l = fifo->in - fifo->out;if (len > l)len = l;kfifo_copy_out(fifo, buf, len, fifo->out);return len;
}unsigned int __kfifo_out(struct __kfifo *fifo,void *buf, unsigned int len)
{len = __kfifo_out_peek(fifo, buf, len);fifo->out += len;return len;
}

fifo.h

#include<stdio.h>
#include<stdlib.h>struct __kfifo {unsigned int    in;      // 入列的时候增加的位置unsigned int    out;     // 出列的时候增加的位置unsigned int    mask;    // 巧妙的 mask 设计,同时包含了数据的个数信息unsigned int    esize;   // 元素的大小void            *data;   // 数据
};int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, size_t esize);
int __kfifo_init(struct __kfifo *fifo, void *buffer,unsigned int size, size_t esize);
void __kfifo_free(struct __kfifo *fifo);
unsigned int __kfifo_in(struct __kfifo *fifo, const void *buf, unsigned int len);
unsigned int __kfifo_out(struct __kfifo *fifo, void *buf, unsigned int len);

test.c

2024-04-07 记录#include<stdio.h>
#include<stdlib.h>
#include"fifo.h"typedef struct node
{int a;int b;
}node;int main()
{int esize = sizeof(node);int size = 8;void *buf = NULL;struct __kfifo fifo;int count;node aa;aa.a = 12;aa.b = 13;node bb;bb.a = 0;bb.b = 0;__kfifo_init(&fifo, buf, size, esize);__kfifo_alloc(&fifo, size, esize);count = __kfifo_in(&fifo, (void *)&aa, 1); //注意这里传参是node的数量,不是node的大小。一开始实践赋值了node的大小,会有内存溢出。printf("in count: %d.\n", count);count = __kfifo_out(&fifo, (void *)&bb, 1);printf("out count: %d.\n", count);printf("bb.a :%d, bb.b :%d.\n", bb.a, bb.b);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于搭建elk日志平台

我这边是使用docker compose进行的搭建 所以在使用的时候 需要自行提前安装docker以及dockercompose环境 或者从官网下载对应安装包也可以 具体文章看下一章节&#xff1a;【ELK】搭建elk日志平台&#xff08;使用docker-compose&#xff09;&#xff0c;并接入springboot项目

实现第一个动态链接库 游戏插件 成功在主程序中运行 dll 中定义的类

devc 5.11编译环境 dll编译环境设置参考 Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 插件 DLL代码和主程序代码如下 注意 dll 代码中的class 类名需要 和主程序 相同 其中使用了函数指针和强制类型转换 函数指针教程参考 以动态库链接库 .dll 探索结构体…

ts中已声明“rule”,但从未读取其值。

在TypeScript中&#xff0c;如果我们在函数中声明了一个参数但没有使用它&#xff0c;TypeScript会给出未使用参数的警告。这是为了帮助我们发现潜在的问题并提高代码质量。但有时候&#xff0c;可能确实存在不需要使用某个参数的情况。 为了解决这个问题&#xff0c;可以通过…

HBase详解(2)

HBase 结构 HRegion 概述 在HBase中&#xff0c;会从行键方向上对表来进行切分&#xff0c;切分出来的每一个结构称之为是一个HRegion 切分之后&#xff0c;每一个HRegion会交给某一个HRegionServer来进行管理。HRegionServer是HBase的从节点&#xff0c;每一个HRegionServ…

elementPlus el-table动态列扩展及二维表格

1、循环列数据源&#xff0c;动态生成列 <template><div><el-table ref"table" :data"pageData.tableData" stripe style"width: 100%"><el-table-column v-for"column in pageData.columns" :key"column.p…

尚硅谷html5+css3(1)html相关知识

1.基本标签&#xff1a; <h1>最大的标题字号 <h2>二号标题字号 <p>换行 2.根标签<html> 包括<head>和<body> <html><head><title>title</title><body>body</body></head> </html> 3…

linux知识点

绝对路径用什么符号表示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命令 绝对路径&#xff1a; 如/etc/init.d当前目录和上层目录&#xff1a; ./ …/主目录&#xff1a; ~/切换目录&#xff1a; cd 怎么查看当前进程&#xff1f;…

162 Linux C++ 通讯架构实战16,UDP/TCP协议的优缺点,使用环境对比。UDP 服务器开发

UDP/TCP协议的优缺点 TCP :面向连接的&#xff0c;可靠数据包传输。对于不稳定的网络层&#xff0c;采取完全弥补的通信方式。丢包重传 优点&#xff1a;稳定&#xff0c;数据流量稳定&#xff0c;速度稳定&#xff0c;顺序稳定 缺点&#xff1a;传输速度慢&…

青藏铁路双寨物流基地扩能改造工程接触网第一杆成功组立

4月2日凌晨&#xff0c;随着吊钩缓缓落下&#xff0c;在中铁电气化局北京电化公司现场作业人员的紧张操作下&#xff0c;青藏铁路双寨物流基地扩能改造工程首根接触网支柱稳稳落在基础上&#xff0c;标志着双寨物流基地扩能改造进入全面施工阶段。 双寨物流基地扩能改造工程包含…

GMSSL学习笔记

概述 GmSSL是由北京大学自主开发的国产商用密码开源库&#xff0c;实现了大部分常用的国密算法&#xff08;SM2、SM3、SM4等&#xff09;以及TLCP协议&#xff0c;使用方法类似openssl。 GmSSL是一个轻量级软件&#xff0c;使用起来也比openssl方便一些。 https://gitee.com…

C#-实现软删除

文章目录 前言1. 使用布尔字段标记删除状态2. 修改查询以忽略软删除的记录3. 实现软删除的方法4. 考虑使用全局查询过滤器5. 处理关联实体6. 考虑性能和存储软删除的好处&#xff1a;软删除的坏处&#xff1a; 总结 前言 后端中&#xff0c;经常使用软删除来标志删除一些数据。…

Part1.Transformer架构

构成&#xff1a; 【手把手教你用Pytorch代码实现Transformer模型&#xff01;从零解读(Pytorch版本&#xff09;-哔哩哔哩】 https://b23.tv/o283hzU

JavaScript逆向爬虫——使用Python模拟执行JavaScript

使用Python模拟执行JavaScript 通过一些调试&#xff0c;我们发现加密参数token是由encrypt方法产生的。如果里面的逻辑相对简单的话&#xff0c;那么我们可以用Python完全重写一遍。但是现实情况往往不是这样的&#xff0c;一般来说&#xff0c;一些加密相关的方法通常会引用…

视觉循迹小车(旭日x3派、opencv)

基于旭日x3派的视觉循迹小车&#xff0c;未完全实现&#xff0c;参考&#xff1a;https://developer.horizon.cc/forumDetail/146176819622746404 效果硬件视觉循迹原理python代码 效果 硬件 1、旭日x3派&#xff08;烧录好系统镜像&#xff09; 2、USB摄像头 3、TB6612 4、小…

C++ //练习 11.29 如果给定的关键字不在容器中,upper_bound、lower_bound和equal_range分别会返回什么?

C Primer&#xff08;第5版&#xff09; 练习 11.29 练习 11.29 如果给定的关键字不在容器中&#xff0c;upper_bound、lower_bound和equal_range分别会返回什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 如果…

HashMap底层源码面试题

面试题1&#xff1a;HashMap是如何实现快速查找的&#xff1f; 答案&#xff1a; HashMap通过哈希表实现快速查找。它内部维护了一个数组&#xff08;称为桶数组或table&#xff09;&#xff0c;每个数组元素是一个链表或红黑树&#xff08;当链表长度超过一定阈值时&#xff…

摄像头校准漫反射板提高识别物体

摄像头校准漫反射板是一种用于摄像头校准的重要工具。在摄像头成像过程中&#xff0c;由于各种因素的影响&#xff0c;如光线、角度、镜头畸变等&#xff0c;会导致摄像头成像出现偏差。为了消除这些偏差&#xff0c;提高摄像头的成像质量&#xff0c;需要使用摄像头校准漫反射…

从头开发一个RISC-V的操作系统(四)嵌入式开发介绍

文章目录 前提嵌入式开发交叉编译GDB调试&#xff0c;QEMU&#xff0c;MAKEFILE练习 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于&#xff1a;[完结] 循序渐进&#x…

第十四讲:C语言字符函数和字符串函数

目录 1. 字符分类函数 2、字符转换函数 3. strlen的使⽤和模拟实现 4. strcpy 的使⽤和模拟实现 5. strcat 的使⽤和模拟实现 6. strcmp 的使⽤和模拟实现 7. strncpy 函数的使⽤ 8. strncat 函数的使⽤ 9. strncmp函数的使⽤ 10. strstr 的使⽤和模拟实现 11. strt…

[LeetCode][LCR186]文物朝代判断——贪心

题目 LCR 186. 文物朝代判断 展览馆展出来自 13 个朝代的文物&#xff0c;每排展柜展出 5 个文物。某排文物的摆放情况记录于数组 places&#xff0c;其中 places[i] 表示处于第 i 位文物的所属朝代编号。其中&#xff0c;编号为 0 的朝代表示未知朝代。请判断并返回这排文物的…