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

1990/11211/port/stream.c (diff list | history)

1990/11161/sys/src/9/port/stream.c:239,2451990/11211/sys/src/9/port/stream.c:239,245 (short | long | prev | next)
1990/0227    
 
	if(q == &qlist[conf.nqueue]){ 
		print("no more queues\n"); 
		error(0, Enoqueue); 
1990/11211    
		error(Enoqueue); 
1990/0227    
	} 
 
	q->flag = QINUSE; 
1990/11161/sys/src/9/port/stream.c:335,3411990/11211/sys/src/9/port/stream.c:335,341
1990/0227    
	Queue *q; 
 
	if(s->procq->next == WR(s->devq)) 
		error(0, Ebadld); 
1990/11211    
		error(Ebadld); 
1990/0227    
	q = s->procq->next; 
	if(q->info->close) 
		(*q->info->close)(RD(q)); 
1990/11161/sys/src/9/port/stream.c:541,5471990/11211/sys/src/9/port/stream.c:541,547
1990/0629    
		freeb(bp); 
	else { 
		freeb(bp); 
		error(0, Ehungup); 
1990/11211    
		error(Ehungup); 
1990/0629    
	} 
1990/0227    
} 
 
1990/11161/sys/src/9/port/stream.c:554,5641990/11211/sys/src/9/port/stream.c:554,564
1990/0911    
	Qinfo *qi; 
1990/0227    
 
	if(name == 0) 
		error(0, Ebadld); 
1990/11211    
		error(Ebadld); 
1990/0911    
	for(qi = lds; qi; qi = qi->next) 
		if(strcmp(qi->name, name)==0) 
			return qi; 
1990/0227    
	error(0, Ebadld); 
1990/11211    
	error(Ebadld); 
1990/0227    
} 
 
/* 
1990/11161/sys/src/9/port/stream.c:608,6151990/11211/sys/src/9/port/stream.c:608,615
1990/0907    
 *  the per stream directory structure 
 */ 
Dirtab streamdir[]={ 
	"data",		Sdataqid,	0,			0600, 
	"ctl",		Sctlqid,	0,			0600, 
1990/11211    
	"data",		{Sdataqid},	0,			0600, 
	"ctl",		{Sctlqid},	0,			0600, 
1990/0907    
}; 
 
/* 
1990/11161/sys/src/9/port/stream.c:633,6391990/11211/sys/src/9/port/stream.c:633,639
1990/0227    
	else 
		return -1; 
 
	devdir(c, STREAMQID(STREAMID(c->qid),tab->qid), tab->name, tab->length, 
1990/11211    
	devdir(c, (Qid){STREAMQID(STREAMID(c->qid.path),tab->qid.path), 0}, tab->name, tab->length, 
1990/0227    
		tab->perm, dp); 
	return 1; 
} 
1990/11161/sys/src/9/port/stream.c:661,6671990/11211/sys/src/9/port/stream.c:661,667
1990/0227    
	} 
	if(s == &slist[conf.nstream]){ 
		print("no more streams\n"); 
		error(0, Enostream); 
1990/11211    
		error(Enostream); 
1990/0227    
	} 
	if(waserror()){ 
1990/11161    
		qunlock(s); 
1990/11161/sys/src/9/port/stream.c:716,7261990/11211/sys/src/9/port/stream.c:716,726
1990/0227    
	 */ 
	for(s = slist; s < &slist[conf.nstream]; s++) { 
		if(s->inuse && s->type == c->type && s->dev == c->dev 
		   && s->id == STREAMID(c->qid)){ 
1990/11211    
		   && s->id == STREAMID(c->qid.path)){ 
1990/11161    
			qlock(s); 
1990/0227    
			if(s->inuse && s->type == c->type 
			&& s->dev == c->dev 
		 	&& s->id == STREAMID(c->qid)){ 
1990/11211    
		 	&& s->id == STREAMID(c->qid.path)){ 
1990/0227    
				s->inuse++; 
1990/0629    
				s->opens++; 
1990/0227    
				c->stream = s; 
1990/11161/sys/src/9/port/stream.c:734,7401990/11211/sys/src/9/port/stream.c:734,740
1990/0227    
	/* 
	 *  create a new stream 
	 */ 
1990/1009    
	c->stream = streamnew(c->type, c->dev, STREAMID(c->qid), qi, 0); 
1990/11211    
	c->stream = streamnew(c->type, c->dev, STREAMID(c->qid.path), qi, 0); 
1990/0227    
} 
 
/* 
1990/11161/sys/src/9/port/stream.c:792,8021990/11211/sys/src/9/port/stream.c:792,803
1990/0227    
 *  On the last close of a stream, for each queue on the 
 *  stream release its blocks and call its close routine. 
 */ 
void 
1990/11211    
int 
1990/1009    
streamclose1(Stream *s) 
1990/0227    
{ 
	Queue *q, *nq; 
	Block *bp; 
1990/11211    
	int rv; 
1990/0227    
 
	/* 
1990/0629    
	 *  decrement the reference count 
1990/11161/sys/src/9/port/stream.c:829,8351990/11211/sys/src/9/port/stream.c:830,836
1990/0629    
			flushq(q); 
		} 
1990/0227    
	} 
1990/0629    
	s->opens--; 
1990/11211    
	rv = --(s->opens); 
1990/0227    
 
	/* 
1990/0629    
	 *  leave it and free it 
1990/11161/sys/src/9/port/stream.c:836,8431990/11211/sys/src/9/port/stream.c:837,845
1990/0227    
	 */ 
1990/0629    
	streamexit(s, 1); 
1990/11161    
	qunlock(s); 
1990/11211    
	return rv; 
1990/0227    
} 
1990/1009    
void 
1990/11211    
int 
1990/1009    
streamclose(Chan *c) 
{ 
	/* 
1990/11161/sys/src/9/port/stream.c:844,8511990/11211/sys/src/9/port/stream.c:846,853
1990/1009    
	 *  if no stream, ignore it 
	 */ 
	if(!c->stream) 
		return; 
	streamclose1(c->stream); 
1990/11211    
		return 1; 
	return streamclose1(c->stream); 
1990/1009    
} 
1990/0227    
 
/* 
1990/11161/sys/src/9/port/stream.c:918,9281990/11211/sys/src/9/port/stream.c:920,930
1990/0930    
	Stream *s; 
 
	s = c->stream; 
	if(STREAMTYPE(c->qid) == Sctlqid){ 
1990/11211    
	if(STREAMTYPE(c->qid.path) == Sctlqid){ 
1990/0930    
		sprint(num, "%d", s->id); 
		return stringread(c, buf, n, num); 
	} else { 
		if(CHDIR & c->qid) 
1990/11211    
		if(CHDIR & c->qid.path) 
1990/0930    
			return devdirread(c, vbuf, n, 0, 0, streamgen); 
		else 
			panic("streamctlread"); 
1990/11161/sys/src/9/port/stream.c:953,9591990/11211/sys/src/9/port/stream.c:955,961
1990/0930    
	int left, i; 
1990/0227    
	uchar *buf = vbuf; 
 
1990/0930    
	if(STREAMTYPE(c->qid) != Sdataqid) 
1990/11211    
	if(STREAMTYPE(c->qid.path) != Sdataqid) 
1990/0930    
		return streamctlread(c, vbuf, n); 
1990/0227    
 
	/* 
1990/11161/sys/src/9/port/stream.c:978,9841990/11211/sys/src/9/port/stream.c:980,986
1990/0331    
				if(s->hread++ < 3) 
					break; 
				else 
					error(0, Ehungup); 
1990/11211    
					error(Ehungup); 
1990/0331    
			} 
1990/0227    
			sleep(&q->r, &isinput, (void *)q); 
			continue; 
1990/11161/sys/src/9/port/stream.c:1023,10291990/11211/sys/src/9/port/stream.c:1025,1031
1990/0227    
	Block *bp; 
1990/0930    
	Stream *s; 
1990/0227    
 
1990/0930    
	if(STREAMTYPE(c->qid) != Sctlqid) 
1990/11211    
	if(STREAMTYPE(c->qid.path) != Sctlqid) 
1990/0930    
		panic("streamctlwrite %lux", c->qid); 
	s = c->stream; 
 
1990/11161/sys/src/9/port/stream.c:1095,11011990/11211/sys/src/9/port/stream.c:1097,1103
1990/0227    
	/* 
	 *  decode the qid 
	 */ 
1990/0930    
	if(STREAMTYPE(c->qid) != Sdataqid) 
1990/11211    
	if(STREAMTYPE(c->qid.path) != Sdataqid) 
1990/0930    
		return streamctlwrite(c, a, n); 
1990/0227    
 
	/* 
1990/11161/sys/src/9/port/stream.c:1103,11091990/11211/sys/src/9/port/stream.c:1105,1111
1990/0227    
	 */ 
	q = s->procq; 
	if(q->other->flag & QHUNGUP) 
		error(0, Ehungup); 
1990/11211    
		error(Ehungup); 
1990/0227    
 
1990/0930    
	if(!docopy && GLOBAL(a)){ 
1990/0227    
		/* 


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