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

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

1990/11211/sys/src/9/port/stream.c:35,411990/1127/sys/src/9/port/stream.c:35,40 (short | long | prev | next)
1990/0227    
 */ 
Stream *slist; 
Queue *qlist; 
Block *blist; 
static Lock garbagelock; 
 
/* 
1990/11211/sys/src/9/port/stream.c:44,491990/1127/sys/src/9/port/stream.c:43,50
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/11211/sys/src/9/port/stream.c:66,941990/1127/sys/src/9/port/stream.c:67,90
1990/0227    
streaminit(void) 
{ 
1990/0907    
	int class, i, n; 
1990/0227    
	Block *bp; 
	Bclass *bcp; 
 
1990/0911    
	/* 
	 *  allocate blocks, queues, and streams 
1990/1127    
	 *  allocate queues, streams 
1990/0911    
	 */ 
1990/0227    
	slist = (Stream *)ialloc(conf.nstream * sizeof(Stream), 0); 
	qlist = (Queue *)ialloc(conf.nqueue * sizeof(Queue), 0); 
	blist = (Block *)ialloc(conf.nblock * sizeof(Block), 0); 
	bp = blist; 
1990/1127    
 
	/* 
	 *  set limits on blocks 
	 */ 
1990/0227    
	n = conf.nblock; 
	for(class = 0; class < Nclass; class++){ 
		if(class < Nclass-1) 
			n = n/2; 
		bcp = &bclass[class]; 
		for(i = 0; i < n; i++) { 
1990/0907    
			if(bcp->size) 
1990/0911    
				bp->base = (uchar *)ialloc(bcp->size, 0); 
1990/0227    
			bp->lim = bp->base + bcp->size; 
			bp->flags = class; 
			freeb(bp); 
			bp++; 
		} 
1990/1127    
		bcp->lim = n; 
		bcp->made = 0; 
1990/0227    
	} 
1990/0911    
 
	/* 
1990/11211/sys/src/9/port/stream.c:111,1161990/1127/sys/src/9/port/stream.c:107,180
1990/0911    
} 
 
/* 
1990/1127    
 *  upgrade a block 0 block to another class (called with bcp qlocked) 
 */ 
newblock(Bclass *bcp) 
{ 
	Page *page; 
	int n; 
	Block *bp; 
	uchar *cp; 
 
	if(bcp->made > bcp->lim) 
		return; 
 
	if(bcp == bclass){ 
		/* 
		 *  create some level zero blocks and return 
		 */ 
		page = newpage(1, 0, 0); 
		page->va = VA(kmap(page)); 
		n = BY2PG/sizeof(Block); 
		bp = (Block *)(page->va); 
		while(n-- > 0){ 
			bp->flags = 0; 
			bp->base = bp->lim = bp->rptr = bp->wptr = 0; 
			if(bcp->first) 
				bcp->last->next = bp; 
			else 
				bcp->first = bp; 
			bcp->last = bp; 
			bcp->made++; 
			bp++; 
		} 
	} else { 
		/* 
		 *  create a page worth of new blocks 
		 */ 
		page = newpage(1, 0, 0); 
		page->va = VA(kmap(page)); 
		n = BY2PG/bcp->size; 
		cp = (uchar *)(page->va); 
		 
		while(n-- > 0){ 
			/* 
			 *  upgrade a level 0 block 
			 */ 
			bp = allocb(0); 
			qlock(bclass); 
			bclass->made--; 
			bcp->made++; 
			bp->flags = bcp - bclass; 
			qunlock(bclass); 
 
			/* 
			 *  tack on the data area 
			 */ 
			bp->base = bp->rptr = bp->wptr = cp; 
			cp += bcp->size; 
			bp->lim = cp; 
			if(bcp->first) 
				bcp->last->next = bp; 
			else 
				bcp->first = bp; 
			bcp->last = bp; 
		} 
	} 
	return; 
} 
 
/* 
1990/0227    
 *  allocate a block 
 */ 
static int 
1990/11211/sys/src/9/port/stream.c:138,1431990/1127/sys/src/9/port/stream.c:202,209
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()){ 
1990/11211/sys/src/9/port/stream.c:846,8521990/1127/sys/src/9/port/stream.c:912,918
1990/1009    
	 *  if no stream, ignore it 
	 */ 
	if(!c->stream) 
1990/11211    
		return 1; 
1990/1127    
		return; 
1990/11211    
	return streamclose1(c->stream); 
1990/1009    
} 
1990/0227    
 


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