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

2001/0128/port/qio.c (diff list | history)

2001/0128/sys/src/9/port/qio.c:779,7932001/0203/sys/src/9/port/qio.c:779,788 (short | long | prev | next)
2001/0128    
static int 
qwait(Queue *q) 
1993/0526    
{ 
2001/0128    
	Block *b; 
1993/0526    
                 
1993/0528    
	/* wait for data */ 
	for(;;){ 
1993/0728    
		b = q->bfirst; 
1997/0327    
		if(b){ 
			QDEBUG checkb(b, "qbread 0"); 
2001/0203    
		if(q->bfirst != nil) 
1993/0728    
			break; 
1997/0327    
		} 
1993/0728    
 
1993/0528    
		if(q->state & Qclosed){ 
1993/0908    
			if(++q->eof > 3) 
2001/0128/sys/src/9/port/qio.c:829,8382001/0203/sys/src/9/port/qio.c:824,829
2001/0128    
static void 
qputback(Queue *q, Block *b) 
{ 
	if(q->state & (Qclosed|Qmsg)){ 
		freeb(b); 
		return; 
1993/0526    
	} 
2001/0128    
	b->next = q->bfirst; 
	if(q->bfirst == nil) 
		q->blast = b; 
2001/0128/sys/src/9/port/qio.c:928,9362001/0203/sys/src/9/port/qio.c:919,930
1995/0714    
qread(Queue *q, void *vp, int len) 
{ 
2001/0128    
	Block *b, *first, *next, **l; 
	int m, n; 
	uchar *p = vp; 
2001/0203    
	int m; 
	uchar *s, *e, *p; 
1995/0714    
 
2001/0203    
	s = p = vp; 
	e = s+len; 
 
2001/0128    
	qlock(&q->rlock); 
	if(waserror()){ 
		qunlock(&q->rlock); 
2001/0128/sys/src/9/port/qio.c:955,9612001/0203/sys/src/9/port/qio.c:949,956
2001/0128    
	/* if we get here, there's at least one block in the queue */ 
	if(q->state & Qcoalesce){ 
		/* when coalescing, 0 length blocks just go away */ 
		if(q->dlen <= 0){ 
2001/0203    
		b = q->bfirst; 
		if(BLEN(b) <= 0){ 
2001/0128    
			freeb(qremove(q)); 
			goto again; 
		} 
2001/0128/sys/src/9/port/qio.c:965,9822001/0203/sys/src/9/port/qio.c:960,976
2001/0128    
		 *  fit in the read. 
		 */ 
		l = &first; 
		b = q->bfirst; 
2001/0127    
		m = BLEN(b); 
2001/0128    
		n = 0; 
		for(;;) { 
			*l = qremove(q); 
			l = &b->next; 
			n += m; 
2001/0203    
			p += m; 
 
2001/0128    
			b = q->bfirst; 
			if(b == nil) 
				break; 
			m = BLEN(b); 
			if(n+m > len) 
2001/0203    
			if(p+m > e) 
2001/0128    
				break; 
		} 
	} else { 
2001/0128/sys/src/9/port/qio.c:985,10032001/0203/sys/src/9/port/qio.c:979,996
2001/0127    
 
2001/0128    
	/* copy to user space outside of the ilock */ 
	iunlock(q); 
	n = 0; 
2001/0203    
	p = s; 
2001/0128    
	for(b = first; b != nil; b = next){ 
2001/0127    
		m = BLEN(b); 
2001/0128    
		if(m > len-n){ 
			m = len - n; 
			n = len; 
2001/0203    
		if(m > e - p){ 
			m = e - p; 
2001/0128    
			memmove(p, b->rp, m); 
2001/0203    
			p += m; 
2001/0128    
			b->rp += m; 
			break; 
		} 
2001/0127    
		memmove(p, b->rp, m); 
2001/0128    
		p += m; 
		n += m; 
		next = b->next; 
		b->next = nil; 
2001/0127    
		freeb(b); 
2001/0128/sys/src/9/port/qio.c:1017,10232001/0203/sys/src/9/port/qio.c:1010,1016
2001/0128    
 
	poperror(); 
	qunlock(&q->rlock); 
	return n; 
2001/0203    
	return p-s; 
1995/0714    
} 
 
1993/0528    
static int 


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