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

📄 loopbackmedium.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "u.h"#include "../port/lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "../port/error.h"#include "ip.h"enum{	Maxtu=	16*1024,};typedef struct LB LB;struct LB{	Proc	*readp;	Queue	*q;	Fs	*f;};static void loopbackread(void *a);static voidloopbackbind(Ipifc *ifc, int, char**){	LB *lb;	lb = smalloc(sizeof(*lb));	lb->f = ifc->conv->p->f;	lb->q = qopen(1024*1024, Qmsg, nil, nil);	ifc->arg = lb;	ifc->mbps = 1000;	kproc("loopbackread", loopbackread, ifc);}static voidloopbackunbind(Ipifc *ifc){	LB *lb = ifc->arg;	if(lb->readp)		postnote(lb->readp, 1, "unbind", 0);	/* wait for reader to die */	while(lb->readp != 0)		tsleep(&up->sleep, return0, 0, 300);	/* clean up */	qfree(lb->q);	free(lb);}static voidloopbackbwrite(Ipifc *ifc, Block *bp, int, uchar*){	LB *lb;	lb = ifc->arg;	if(qpass(lb->q, bp) < 0)		ifc->outerr++;	ifc->out++;}static voidloopbackread(void *a){	Ipifc *ifc;	Block *bp;	LB *lb;	ifc = a;	lb = ifc->arg;	lb->readp = up;	/* hide identity under a rock for unbind */	if(waserror()){		lb->readp = 0;		pexit("hangup", 1);	}	for(;;){		bp = qbread(lb->q, Maxtu);		if(bp == nil)			continue;		ifc->in++;		if(!canrlock(ifc)){			freeb(bp);			continue;		}		if(waserror()){			runlock(ifc);			nexterror();		}		if(ifc->lifc == nil)			freeb(bp);		else			ipiput4(lb->f, ifc, bp);		runlock(ifc);		poperror();	}}Medium loopbackmedium ={.hsize=		0,.mintu=		0,.maxtu=		Maxtu,.maclen=	0,.name=		"loopback",.bind=		loopbackbind,.unbind=	loopbackunbind,.bwrite=	loopbackbwrite,};voidloopbackmediumlink(void){	addipmedium(&loopbackmedium);}

⌨️ 快捷键说明

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