//作者:京东瀚览家居官方旗舰店 <--点击关注
//文件名:Chunk.c
/**
* the network chunk-API
*
*
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "chunk.h"
/* 初始化并返回一个chunkqueue 结构体指针*/
chunkqueue *chunkqueue_init(void) {
chunkqueue *cq;
cq = calloc(1, sizeof(*cq));
cq->first = NULL;
cq->last = NULL;
cq->unused = NULL;
return cq;
}
/* 初始化并返回一个chunk 结构体指针*/
static chunk *chunk_init(void) {
chunk *c;
c = calloc(1, sizeof(*c));
c->mem = buffer_init();
c->file.name = buffer_init();
c->file.fd = -1;
c->file.mmap.start = MAP_FAILED; /* */
c->next = NULL;
return c;
}
/* 释放一个 chunk 结构体*/
static void chunk_free(chunk *c) {
if (!c) return;
buffer_free(c->mem);
buffer_free(c->file.name);
free(c);
}
/* 重置一个chunk 结构体*/
static void chunk_reset(chunk *c) {
if (!c) return;
buffer_reset(c->mem);
if (c->file.is_temp && !buffer_is_empty(c->file.name)) {
unlink(c->file.name->ptr);
}
buffer_reset(c->file.name);
if (c->file.fd != -1) {
close(c->file.fd);
c->file.fd = -1;
}
if (MAP_FAILED != c->file.mmap.start) {
munmap(c->file.mmap.start, c->file.mmap.length);
c->file.mmap.start = MAP_FAILED;
}
}
/* 释放一个chunkqueue 结构体*/
void chunkqueue_free(chunkqueue *cq) {
chunk *c, *pc;
if (!cq) return;
for (c = cq->first; c; ) {
pc = c;
c = c->next;
chunk_free(pc);
}
for (c = cq->unus