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

1991/0831/port/stream.c (diff list | history)

1991/0811/sys/src/9/port/stream.c:43,531991/0831/sys/src/9/port/stream.c:43,50 (short | long | prev | next)
1990/0227    
 */ 
typedef struct { 
	int	size; 
1990/1127    
	int	lim; 
	int	made; 
1990/0312    
	Blist; 
1990/03292    
	QLock;		/* qlock for sleepers on r */ 
1990/0312    
	Rendez	r;	/* sleep here waiting for blocks */ 
1990/0227    
} Bclass; 
Bclass bclass[Nclass]={ 
	{ 0 }, 
1991/0811/sys/src/9/port/stream.c:74,801991/0831/sys/src/9/port/stream.c:71,77
1990/0227    
	qlist = (Queue *)ialloc(conf.nqueue * sizeof(Queue), 0); 
1990/1127    
 
	/* 
	 *  set limits on blocks 
1991/0831    
	 *  set block classes 
1990/1127    
	 */ 
1990/0227    
	n = conf.nblock; 
	for(class = 0; class < Nclass; class++){ 
1991/0811/sys/src/9/port/stream.c:81,871991/0831/sys/src/9/port/stream.c:78,83
1990/0227    
		if(class < Nclass-1) 
			n = n/2; 
		bcp = &bclass[class]; 
1990/1127    
		bcp->lim = n; 
		bcp->made = 0; 
1990/0227    
	} 
1990/0911    
 
1991/0811/sys/src/9/port/stream.c:115,1231991/0831/sys/src/9/port/stream.c:111,116
1990/1127    
	Block *bp; 
	uchar *cp; 
 
	if(bcp->made > bcp->lim) 
1990/1214    
		return -1; 
1990/1127    
                 
1991/0705    
	page = newpage(1, 0, 0); 
	page->va = VA(kmap(page)); 
1990/1127    
	if(bcp == bclass){ 
1991/0811/sys/src/9/port/stream.c:149,1591991/0831/sys/src/9/port/stream.c:142,152
1990/1127    
			 *  upgrade a level 0 block 
			 */ 
			bp = allocb(0); 
			qlock(bclass); 
1991/0831    
			lock(bclass); 
1990/1127    
			bclass->made--; 
			bcp->made++; 
			bp->flags = bcp - bclass; 
			qunlock(bclass); 
1991/0831    
			unlock(bclass); 
1990/1127    
 
			/* 
			 *  tack on the data area 
1991/0811/sys/src/9/port/stream.c:199,2161991/0831/sys/src/9/port/stream.c:192,203
1990/0227    
	 */ 
	lock(bcp); 
	while(bcp->first == 0){ 
1990/1127    
		if(newblock(bcp) == 0) 
			continue; 
1990/0227    
		unlock(bcp); 
1990/03292    
		qlock(bcp); 
1990/1113    
		if(waserror()){ 
			qunlock(bcp); 
1991/0831    
			unlock(bcp); 
1990/1113    
			nexterror(); 
		} 
1990/0322    
		tsleep(&bcp->r, isblock, (void *)bcp, 250); 
1990/03292    
		qunlock(bcp); 
1991/0831    
		newblock(bcp); 
1990/1113    
		poperror(); 
1990/0227    
		lock(bcp); 
	} 
	bp = bcp->first; 
	bcp->first = bp->next; 
1991/0811/sys/src/9/port/stream.c:1462,14681991/0831/sys/src/9/port/stream.c:1449,1456
1990/0911    
		for(count = 0, bp = bcp->first; bp; count++, bp = bp->next) 
			; 
		unlock(bcp); 
		print("%d blocks of size %d\n", count, bcp->size); 
1991/0831    
		print("%d byte blocks: %d made %d free\n", bcp->size, 
			bcp->made, count); 
1990/0911    
	} 
	print("\n"); 
1990/0227    
} 


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