⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buf.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* * Buffered I/O on block devices. * Write buffering ignores offset. */#include <u.h>#include <libc.h>#include <disk.h>#include "dat.h"#include "fns.h"Buf*bopen(long (*fn)(Buf*, void*, long, long), int omode, int bs, int nblock){	Buf *b;	assert(omode == OREAD || OWRITE);	assert(bs > 0 && nblock > 0);	assert(fn != nil);	b = emalloc(sizeof(*b));	b->data = emalloc(bs*nblock);	b->ndata = 0;	b->nblock = nblock;	b->bs = bs;	b->omode = omode;	b->fn = fn;	return b;}longbread(Buf *b, void *v, long n, long off){	long m, noff;	assert(b->omode == OREAD);	/* Refill buffer */	if(b->off > off || off >= b->off+b->ndata) {		noff = off - off % b->bs;		if(vflag)			fprint(2, "try refill at %ld\n", noff);		if((m = b->fn(b, b->data, Nblock, noff/b->bs)) <= 0)			return m;		b->ndata = b->bs * m;		b->off = noff;		if(vflag)			fprint(2, "refill %ld at %ld\n", b->ndata, b->off);	}//	fprint(2, "read %ld at %ld\n", n, off);	/* Satisfy request from buffer */	off -= b->off;	if(n > b->ndata - off)		n = b->ndata - off;	memmove(v, b->data+off, n);	return n;}longbwrite(Buf *b, void *v, long n){	long on, m, mdata;	uchar *p;	p = v;	on = n;	/* Fill buffer */	mdata = b->bs*b->nblock;	m = mdata - b->ndata;	if(m > n)		m = n;	memmove(b->data+b->ndata, p, m);	p += m;	n -= m;	b->ndata += m;	/* Flush buffer */	if(b->ndata == mdata) {		if(b->fn(b, b->data, b->nblock, 0) < 0) {			if(vflag)				fprint(2, "write fails: %r\n");			return -1;		}		b->ndata = 0;	}	/* For now, don't worry about big writes; 9P only does 8k */	assert(n < mdata);	/* Add remainder to buffer */	if(n) {		memmove(b->data, p, n);		b->ndata = n;	}	return on;}voidbterm(Buf *b){	if(b->omode == OWRITE && b->ndata)		b->fn(b, b->data, (b->ndata+b->bs-1)/b->bs, b->off); 	free(b->data);	free(b);}

⌨️ 快捷键说明

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