一个读写缓冲模块
来源:互联网 发布:日本知福山图书馆 编辑:程序博客网 时间:2024/05/05 01:46
<pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#define ARG_IS_VALID(exr, ret) do\{\ if (!(exr))\ {\ printf("invalid argument: failed to jugde %s\n", #exr);\ return ret;\ }\}while(0)#define SUCCESS 0#define FAILURE -1#define _Free(arg) __Free((void**)arg)typedef struct TAG_READ_BUFF_T{ int ReadPosition; int WritePosition; int BuffSize; void* Begin;}READ_BUFF_T;void* _Malloc(int bytes){ ARG_IS_VALID(bytes > 0, NULL); int AlignSize = _Align(bytes); void* ret = malloc(AlignSize); if (NULL != ret) { memset(ret, 0, AlignSize); }else { printf("malloc error.size: %d\n", AlignSize); } return ret;}int __Free(void** ptr){ ARG_IS_VALID(NULL != ptr, FAILURE); ARG_IS_VALID(NULL != (*ptr), FAILURE); free(*ptr); *ptr = NULL; return SUCCESS;}static int __GetBufWritable(READ_BUFF_T* pReadBuf, void** Begin, int* Len){ ARG_IS_VALID(NULL != pReadBuf, FALURE); ARG_IS_VALID(NULL != Begin, FALURE); ARG_IS_VALID(NULL != Len, FALURE); *Begin = pReadBuf->Begin + pReadBuf->WritePosition; *Len = pReadBuf->BuffSize - pReadBuf->WritePosition; printf("buffer has %d blank space.\n", *Len); return SUCCESS;}static int __GetBufReadable(READ_BUFF_T* pReadBuf, void** Begin, int* Len){ ARG_IS_VALID(NULL != pReadBuf, FALURE); ARG_IS_VALID(NULL != Begin, FALURE); ARG_IS_VALID(NULL != Len, FALURE); *Begin = pReadBuf->Begin + pReadBuf->ReadPosition; *Len = pReadBuf->WritePosition - pReadBuf->ReadPosition; printf("buffer has %d bytes space need to read.\n", *Len); return SUCCESS;}static int __ResetWritablePosition(READ_BUFF_T* pReadBuf, int length){ ARG_IS_VALID(NULL != pReadBuf, FALURE); ARG_IS_VALID(length <= pReadBuf->BuffSize - pReadBuf->WritePosition, FALURE); pReadBuf->WritePosition += length; return SUCCESS;}static int __ResetReadablePosition(READ_BUFF_T* pReadBuf, int length){ ARG_IS_VALID(NULL != pReadBuf, FALURE); ARG_IS_VALID(length <= pReadBuf->WritePosition - pReadBuf->ReadPosition, FALURE); pReadBuf->ReadPosition += length; return SUCCESS;}static int __ReserveBuff(READ_BUFF_T* pReadBuf, int length){ ARG_IS_VALID(NULL != pReadBuf, FALURE); ARG_IS_VALID(length <= pReadBuf->BuffSize, FALURE); if (pReadBuf->BuffSize - pReadBuf->WritePosition >= length) { } else if (pReadBuf->BuffSize - pReadBuf->WritePosition + pReadBuf->ReadPosition >= length) { memmove(pReadBuf->Begin, pReadBuf->Begin+ pReadBuf->ReadPosition, pReadBuf->WritePosition - pReadBuf->ReadPosition); pReadBuf->WritePosition -= pReadBuf->ReadPosition; pReadBuf->ReadPosition = 0; }else { printf("no enough reserve buffer[%d bytes]\n", length); return FALURE; } return SUCCESS;}static READ_BUFF_T* READ_BUFF_Init(int BuffSize){ ARG_IS_VALID(BuffSize > 0, NULL); READ_BUFF_T* pstReadBuff = (READ_BUFF_T*)AJB_Malloc(sizeof(READ_BUFF_T) + BuffSize); EX_ASSERT(NULL != pstReadBuff); pstReadBuff->BuffSize = BuffSize; pstReadBuff->ReadPosition = 0; pstReadBuff->WritePosition = 0; pstReadBuff->Begin = (void*)(pstReadBuff+1); printf("read buffer init completed.size: %d\n", BuffSize); return pstReadBuff;}static int READ_BUFF_Destroy(READ_BUFF_T** pstReadBuff){ ARG_IS_VALID(NULL != pstReadBuff, FALURE); ARG_IS_VALID(NULL != *pstReadBuff, FALURE); AJB_Free(pstReadBuff); printf("destroy read buff completed.pstReadBuff: 0x%p\n", *pstReadBuff); return SUCCESS;}
0 0
- 一个读写缓冲模块
- 读写锁ReadWriteLock的基本使用,创建一个缓冲池。
- 使用读写缓冲
- 一个非常简单的缓冲—使用Java5提供的读写锁处理多线程操作
- 关于流的缓冲读写
- 利用Java读写锁设计缓冲类
- python文件读写的缓冲行为
- java中缓冲读写buffer基础程序
- WindowsXp文件读写模块
- 驱动模块读写寄存器
- 【python】【excel读写 模块】
- Node.js之缓冲模块Buffer
- 分享一个登录缓冲界面
- 一个GDI双缓冲类
- 实现一个双缓冲队列
- 实现一个双缓冲队列
- 实现一个双缓冲队列
- 实现一个双缓冲队列
- Yii2的RESTful API开发
- js特效示例
- java动态加载指定的类或者jar包反射调用其方法
- Climbing Stairs
- windows8.1和ubuntu15.04的双启动问题
- 一个读写缓冲模块
- java 利用jacob.jar将word转pdf
- C++之静态成员变量和静态成员函数
- Linux查看内存大小和插槽
- mybatis 字符串比较
- Java开发中的23种设计模式详解(转)
- Yii2 Restful API 原理分析
- ASP.NET MVC 相关资源
- 腾讯移动性能评测专家叶方正:Android优化笔记