fifo 简单实现
16lz
2021-01-26
#define FIFO_SIZE_T size_t#define FIFO_MIN 0x4000typedef struct { char * data; size_t allocation; /* Number of bytes allocated for data. */ size_t item_size; /* Size of each item in data */ size_t begin; /* Offset of the first byte to read. */ size_t end; /* 1 + Offset of the last byte byte to read. */} fifo_t;static void fifo_clear(fifo_t * f){ f->end = f->begin = 0;}static void * fifo_reserve(fifo_t * f, FIFO_SIZE_T n){ n *= f->item_size; if (f->begin == f->end) fifo_clear(f); while (1) { if (f->end + n <= f->allocation) { void *p = f->data + f->end; f->end += n; return p; } if (f->begin > FIFO_MIN) { memmove(f->data, f->data + f->begin, f->end - f->begin); f->end -= f->begin; f->begin = 0; continue; } f->allocation += n; f->data = (char *)realloc(f->data, f->allocation); }}static void * fifo_write(fifo_t * f, FIFO_SIZE_T n, void const * data){ void * s = fifo_reserve(f, n); if (data) memcpy(s, data, n * f->item_size); return s;}static void * fifo_read(fifo_t * f, FIFO_SIZE_T n, void * data){ char * ret = f->data + f->begin; n *= f->item_size; if (n > (FIFO_SIZE_T)(f->end - f->begin)) return NULL; if (data) memcpy(data, ret, (size_t)n); f->begin += n; return ret;}static void fifo_delete(fifo_t * f){ free(f->data);}static void fifo_create(fifo_t * f, FIFO_SIZE_T item_size){ f->item_size = item_size; f->allocation = FIFO_MIN; f->data = (char *)malloc(f->allocation); fifo_clear(f);}
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer