buf.c

来自「一个完整的SHELL实现源代码」· C语言 代码 · 共 66 行

C
66
字号
#include "fs.h"

char g_buffers[NBUF][514];
buf g_buf[NBUF];

static s_int lastb=0;

/* bread(bno)
   ==========
   find a buffer that contains the bno block.
   read from disc when not found.
*/
void *bread(s_int bno)
{
	s_int i;
	for(i=0;i<NBUF;i++)
		if((g_buf[i].flags&B_READ) && g_buf[i].blkno==bno)
		{
			/*g_buf[i].flags|=B_READ;*/
			return g_buffers[i];
		}
	i=lastb;
	lastb=(i+1)%NBUF;

	/* if block changed, write back */
	if(g_buf[i].flags & B_READ)
	{
		hd_write(g_buf[i].blkno,g_buffers[i]);
		g_buf[i].flags &= ~B_READ;
	}

	if(!hd_read(bno,g_buffers[i]))
		panic("bread(): hd_read failed.");
	g_buf[i].blkno=bno;
	g_buf[i].flags|=B_READ;
	return g_buffers[i];
}

s_int bwrite_back()
{
	s_int i;
	for(i=0;i<NBUF;i++)
	{
       	if(g_buf[i].flags & B_READ)
		{
			hd_write(g_buf[i].blkno,g_buffers[i]);
			g_buf[i].flags &= ~B_READ;
       	}
	}
	return 0;
}
/* buf_init()
   ==========
   initialize the g_buf array
*/
s_int buf_init()
{
	s_int i;
	for(i=0;i<NBUF;i++)
	{
		g_buf[i].blkno=0;
		g_buf[i].flags=0;
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?