plan 9 kernel history: overview | file list | diff list

1990/0619/port/devmnt.c (diff list | history)

1990/0617/sys/src/9/port/devmnt.c:65,701990/0619/sys/src/9/port/devmnt.c:65,71 (short | long | prev | next)
1990/0303    
struct 
{ 
	Lock; 
1990/0619    
	QLock; 
1990/0604    
	MntQ	*arena; 
	MntQ	*free; 
}mntqalloc; 
1990/0617/sys/src/9/port/devmnt.c:141,1471990/0619/sys/src/9/port/devmnt.c:142,148
1990/0227    
} 
 
1990/0604    
MntQ* 
1990/0617    
mqalloc(Chan *msg)	/* mntqalloc is locked */ 
1990/0619    
mqalloc(Chan *msg)	/* mntqalloc is qlocked */ 
1990/0604    
{ 
	MntQ *q; 
 
1990/0617/sys/src/9/port/devmnt.c:166,1721990/0619/sys/src/9/port/devmnt.c:167,172
1990/0604    
 
	lock(mq); 
	if(--mq->ref == 0){ 
1990/0617    
print("mqfree %lux %lux\n", mq->reader, mq->writer); 
1990/0604    
		msg = mq->msg; 
		mq->msg = 0; 
		lock(&mntqalloc); 
1990/0617/sys/src/9/port/devmnt.c:271,2771990/0619/sys/src/9/port/devmnt.c:271,277
1990/0604    
	 * Look for queue to same msg channel 
	 */ 
	q = mntqalloc.arena; 
1990/0617    
	lock(&mntqalloc); 
1990/0619    
	qlock(&mntqalloc); 
1990/0604    
	for(i=0; i<conf.nmntdev; i++,q++) 
		if(q->msg==cm){ 
			lock(q); 
1990/0617/sys/src/9/port/devmnt.c:286,2921990/0619/sys/src/9/port/devmnt.c:286,292
1990/0617    
	m->q = mqalloc(cm); 
1990/0604    
 
    out: 
1990/0617    
	unlock(&mntqalloc); 
1990/0619    
	qunlock(&mntqalloc); 
1990/0227    
	mh = mhalloc(); 
	if(waserror()){ 
		mhfree(mh); 
1990/0617/sys/src/9/port/devmnt.c:674,6891990/0619/sys/src/9/port/devmnt.c:674,689
1990/0227    
mntxmit(Mnt *m, Mnthdr *mh) 
{ 
	ulong n; 
	Mntbuf *mbr, *mbw; 
1990/0619    
	Mntbuf *mbw; 
1990/0604    
	Mnthdr *w, *ow; 
	Chan *mntpt; 
	MntQ *q; 
	int qlocked; 
1990/0227    
 
	mbr = mballoc(); 
1990/0619    
	mh->mbr = mballoc(); 
1990/0227    
	mbw = mballoc(); 
	if(waserror()){ 
		mbfree(mbr); 
1990/0619    
		mbfree(mh->mbr); 
1990/0227    
		mbfree(mbw); 
		nexterror(); 
	} 
1990/0617/sys/src/9/port/devmnt.c:712,7221990/0619/sys/src/9/port/devmnt.c:712,722
1990/0227    
	/* 
	 * Read response 
	 */ 
1990/0604    
	n = (*devtab[q->msg->type].read)(q->msg, mbr->buf, BUFSIZE); 
1990/0619    
	n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); 
1990/0604    
	mqfree(q); 
1990/0511    
	poperror(); 
 
	if(convM2S(mbr->buf, &mh->rhdr, n) == 0){ 
1990/0619    
	if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ 
1990/0604    
		print("format error in mntxmit\n"); 
		error(0, Ebadmsg); 
1990/0511    
	} 
1990/0617/sys/src/9/port/devmnt.c:744,7501990/0619/sys/src/9/port/devmnt.c:744,750
1990/0511    
	 */ 
	if(mh->thdr.type == Tread) 
		memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); 
	mbfree(mbr); 
1990/0619    
	mbfree(mh->mbr); 
1990/0511    
	mbfree(mbw); 
	poperror(); 
	return; 
1990/0617/sys/src/9/port/devmnt.c:769,7771990/0619/sys/src/9/port/devmnt.c:769,777
1990/0604    
    Read: 
		qunlock(q); 
		qlocked = 0; 
		n = (*devtab[q->msg->type].read)(q->msg, mbr->buf, BUFSIZE); 
		if(convM2S(mbr->buf, &mh->rhdr, n) == 0){ 
1990/0617    
			print("%lux %lux %lux %d format error in mntxmit %s\n", u->p, q->reader, q->writer, n, u->p->text); 
1990/0619    
		n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); 
		if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ 
			print("format error in mntxmit\n"); 
1990/0604    
			mnterrdequeue(q, mh); 
			error(0, Ebadmsg); 
		} 
1990/0617/sys/src/9/port/devmnt.c:795,8071990/0619/sys/src/9/port/devmnt.c:795,807
1990/0604    
		/* 
		 * Hand response to correct recipient 
		 */ 
1990/0617    
if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr.type, mh->rhdr.err, mh->rhdr.fid, mh->thdr.type, mh->thdr.fid); 
1990/0619    
		if(q->writer==0) print("response with empty queue\n"); 
1990/0604    
		for(ow=0,w=q->writer; w; ow=w,w=w->next) 
			if(mh->rhdr.fid == w->thdr.fid 
			&& mh->rhdr.type == w->thdr.type+1){ 
				Mntbuf *t; 
				t = mbr; 
				mbr = w->mbr; 
1990/0619    
				t = mh->mbr; 
				mh->mbr = w->mbr; 
1990/0604    
				w->mbr = t; 
				memcpy(&w->rhdr, &mh->rhdr, sizeof mh->rhdr); 
				/* take recipient from queue */ 
1990/0617/sys/src/9/port/devmnt.c:814,8201990/0619/sys/src/9/port/devmnt.c:814,819
1990/0604    
			} 
		goto Read; 
	}else{ 
		mh->mbr = mbr; 
		mh->p = u->p; 
		/* put self in queue */ 
		mh->next = q->writer; 
1990/0617/sys/src/9/port/devmnt.c:822,8281990/0619/sys/src/9/port/devmnt.c:821,827
1990/0604    
		qunlock(q); 
		qlocked = 0; 
		if(waserror()){		/* interrupted sleep */ 
1990/0617    
			print("%lux interrupted i/o %d %d\n", u->p, mh->thdr.type, mh->thdr.fid); 
1990/0619    
			print("interrupted i/o\n"); 
1990/0604    
			mnterrdequeue(q, mh); 
			nexterror(); 
		} 
1990/0617/sys/src/9/port/devmnt.c:832,8381990/0619/sys/src/9/port/devmnt.c:831,836
1990/0604    
		qlocked = 1; 
		if(q->reader == u->p)	/* i got promoted */ 
			goto Read; 
		mbr = mh->mbr;		/* pick up my buffer */ 
		qunlock(q); 
		qlocked = 0; 
		goto Respond; 
1990/0617/sys/src/9/port/devmnt.c:852,8581990/0619/sys/src/9/port/devmnt.c:850,856
1990/0227    
	 */ 
	if(mh->thdr.type == Tread) 
		memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); 
	mbfree(mbr); 
1990/0619    
	mbfree(mh->mbr); 
1990/0227    
	mbfree(mbw); 
	poperror(); 
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)