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

📄 req.cc

📁 南京航空航天大学开发的一个类Unix和Linux的操作系统,好不好看看就知道了,
💻 CC
字号:
#include <lib/root.h> #include <init/ctor.h>#include <asm/system.h>#include "dev.h"#include "req.h"req_t::req_t(int rw, buf_t * b){	next = prev = NULL;	cmd = rw;	dev = b->dev;	bsize = b->bsize;	sectperblk = bsize >> SECTBITS;	startsect = b->bno * sectperblk;	nsect = sectperblk; 	bufq.enqtail(b);	setcur();}void req_t::setcur(){	curbuf = bufq.head();	endbuf = bufq.vnode();	cursect = curbuf->data;	endsect = curbuf->data + curbuf->bsize;}req_t::~req_t(){	buf_t * b;	while (b = bufq.deqhead()) {		if (b->state == BERROR)			b->state = BINVAL;		else			b->state = BCLEAN;		b->unlock();		}}/* if b has been merged into this req, return 1 */int req_t::merge(int rw, buf_t * b){	if ((rw != cmd) || (b->dev != dev) || (b->bsize != bsize))		return 0;	if (nsect + sectperblk > 255) {		warn("exceed hardware limit\n");		return 0;	}	assert(!b->nextreq && !b->prevreq);	if (startsect + nsect == b->bno * sectperblk) {		nsect += sectperblk;		bufq.enqtail(b);		setcur();		return 1;	}	if (b->bno * sectperblk + sectperblk == startsect) {		startsect -= sectperblk;		nsect += sectperblk;		bufq.enqhead(b);		setcur();		return 1;	}	return 	0;}void req_t::nextsect(int state){	assert(more());	if (state == BERROR)		curbuf->state = BERROR;	if ((cursect += SECTSIZE) != endsect)		return;	if ((curbuf = curbuf->nextreq) != endbuf) {		cursect = curbuf->data;		endsect = curbuf->data + curbuf->bsize;		return;	}		curbuf = endbuf = NULL;	cursect = endsect = NULL;}void req_t::error(int nsect_){	warn("io error\n");	while ((nsect_-->0) && more())		nextsect(BERROR);}void req_t::advance(int nsect_){	while ((nsect_-->0) && more())		nextsect(BCLEAN);}scanreq_t::scanreq_t(req_t * req, int nsect_){	curbuf = req->curbuf;	endbuf = req->endbuf;	cursect = req->cursect; 	endsect = req->endsect; 	nsect = nsect_;}void scanreq_t::next(){	assert(more());	if (!--nsect)		return;	if ((cursect += SECTSIZE) != endsect)		return;	if ((curbuf = curbuf->nextreq) != endbuf) {		cursect = curbuf->data;		endsect = curbuf->data + curbuf->bsize;		return;	}		curbuf = endbuf = NULL;	cursect = endsect = NULL;}

⌨️ 快捷键说明

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