req.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 114 行

C
114
字号
#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 + =
减小字号Ctrl + -
显示快捷键?