代码拉取完成,页面将自动刷新
/*
* extmem.c
* Zhaonian Zou
* Harbin Institute of Technology
* Jun 22, 2011
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "extmem.h"
// 初始化缓冲区 返回指向该缓冲区的地址
Buffer *initBuffer(size_t bufSize, size_t blkSize, Buffer *buf)
{
int i;
buf->numIO = 0;
buf->bufSize = bufSize;
buf->blkSize = blkSize;
buf->numAllBlk = bufSize / (blkSize + 1);
buf->numFreeBlk = buf->numAllBlk;
buf->data = (unsigned char*)malloc(bufSize * sizeof(unsigned char));
if (!buf->data)
{
perror("Buffer Initialization Failed!\n");
return NULL;
}
memset(buf->data, 0, bufSize * sizeof(unsigned char));
return buf;
}
// 释放缓冲区buf占用的内存空间
void freeBuffer(Buffer *buf)
{
free(buf->data);
}
// 在缓冲区 buf 中申请一个新的块。若申请成功,则返回该块的起始地址
unsigned char *getNewBlockInBuffer(Buffer *buf)
{
unsigned char *blkPtr;
if (buf->numFreeBlk == 0)
{
perror("Buffer is full!\n");
return NULL;
}
blkPtr = buf->data;
// 遍历缓冲区寻找下一个可用块
while (blkPtr < buf->data + (buf->blkSize + 1) * buf->numAllBlk)
{
if (*blkPtr == BLOCK_AVAILABLE)
break;
else
blkPtr += buf->blkSize + 1;
}
*blkPtr = BLOCK_UNAVAILABLE;
buf->numFreeBlk--;
return blkPtr + 1;
}
// 解除块blk对缓冲区内存的占用,即将 blk 占据的内存区域标记为可用
void freeBlockInBuffer(unsigned char *blk, Buffer *buf)
{
*(blk - 1) = BLOCK_AVAILABLE;
buf->numFreeBlk++;
}
// 从磁盘上删除地址为 addr 的磁盘块内的数据
int dropBlockOnDisk(unsigned int addr)
{
char filename[40];
sprintf(filename, "data/%d.blk", addr);
// 删除这个文件
if (remove(filename) == -1)
{
perror("Dropping Block Fails!\n");
return -1;
}
return 0;
}
// 将磁盘上地址为 addr 的磁盘块读入缓冲区 buf。若读取成功,则返回缓冲区内该块的地址
unsigned char *readBlockFromDisk(unsigned int addr, Buffer *buf)
{
char filename[40];
unsigned char *blkPtr, *bytePtr;
char ch;
if (buf->numFreeBlk == 0)
{
perror("Buffer Overflows!\n");
return NULL;
}
blkPtr = buf->data;
// 遍历buf找到一个空闲块
while (blkPtr < buf->data + (buf->blkSize + 1) * buf->numAllBlk)
{
if (*blkPtr == BLOCK_AVAILABLE)
break;
else
blkPtr += buf->blkSize + 1;
}
// 打开文件
sprintf(filename, "data/%d.blk", addr);
FILE *fp = fopen(filename, "r");
if (!fp)
{
printf("addr: %d\n", addr);
perror("Reading Block Failed!\n");
return NULL;
}
*blkPtr = BLOCK_UNAVAILABLE;
blkPtr++;
bytePtr = blkPtr;
// 将对应的内容读入这个缓存块
while (bytePtr < blkPtr + buf->blkSize)
{
ch = fgetc(fp);
*bytePtr = ch;
bytePtr++;
}
fclose(fp);
buf->numFreeBlk--;
buf->numIO++;
return blkPtr;
}
// 将缓冲区buf内的块blk写入磁盘上地址为addr的磁盘块
int writeBlockToDisk(unsigned char *blkPtr, unsigned int addr, Buffer *buf)
{
char filename[40];
unsigned char *bytePtr;
// 打开这个文件
sprintf(filename, "data/%d.blk", addr);
// 已存在的文件将内容清空,只允许写
FILE *fp = fopen(filename, "w");
if (!fp)
{
perror("Writing Block Failed!\n");
return -1;
}
// 将信息写入
for (bytePtr = blkPtr; bytePtr < blkPtr + buf->blkSize; bytePtr++)
fputc((int)(*bytePtr), fp);
fclose(fp);
*(blkPtr - 1) = BLOCK_AVAILABLE;//重新将块置为可用,特别要注意这里
buf->numFreeBlk++;
buf->numIO++;
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。