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

📄 req.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <auth.h>#include <fcall.h>#include <thread.h>#include <9p.h>static voidincreqref(void *v){	Req *r;	r = v;	if(r){if(chatty9p > 1)	fprint(2, "increfreq %p %ld\n", r, r->ref.ref);		incref(&r->ref);	}}Reqpool*allocreqpool(void (*destroy)(Req*)){	Reqpool *f;	f = emalloc9p(sizeof *f);	f->map = allocmap(increqref);	f->destroy = destroy;	return f;}voidfreereqpool(Reqpool *p){	freemap(p->map, (void(*)(void*))p->destroy);	free(p);}	Req*allocreq(Reqpool *pool, ulong tag){	Req *r;	r = emalloc9p(sizeof *r);	r->tag = tag;	r->pool = pool;	increqref(r);	increqref(r);	if(caninsertkey(pool->map, tag, r) == 0){		closereq(r);		closereq(r);		return nil;	}	return r;}Req*lookupreq(Reqpool *pool, ulong tag){if(chatty9p > 1)	fprint(2, "lookupreq %lud\n", tag);	return lookupkey(pool->map, tag);}voidclosereq(Req *r){	int i;	if(r == nil)		return;if(chatty9p > 1)	fprint(2, "closereq %p %ld\n", r, r->ref.ref);	if(decref(&r->ref) == 0){		if(r->fid)			closefid(r->fid);		if(r->newfid)			closefid(r->newfid);		if(r->afid)			closefid(r->afid);		if(r->oldreq)			closereq(r->oldreq);		for(i=0; i<r->nflush; i++)			respond(r->flush[i], nil);		free(r->flush);		switch(r->ifcall.type){		case Tstat:			free(r->ofcall.stat);			free(r->d.name);			free(r->d.uid);			free(r->d.gid);			free(r->d.muid);			break;		}		if(r->pool->destroy)			r->pool->destroy(r);		free(r->buf);		free(r->rbuf);		free(r);	}}Req*removereq(Reqpool *pool, ulong tag){if(chatty9p > 1)	fprint(2, "removereq %lud\n", tag);	return deletekey(pool->map, tag);}

⌨️ 快捷键说明

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