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

1992/0430/port/segment.c (diff list | history)

1991/0705/sys/src/9/port/segment.c:11,161991/0706/sys/src/9/port/segment.c:11,17 (short | long)
1991/0705    
Page *lkpage(ulong addr); 
Page *snewpage(ulong addr); 
void lkpgfree(Page*); 
1991/0706    
void imagereclaim(void); 
1991/0705    
 
/* System specific segattach devices */ 
#include "segment.h" 
1991/0705/sys/src/9/port/segment.c:30,351991/0706/sys/src/9/port/segment.c:31,38
1991/0705    
	Segment *free; 
}segalloc; 
 
1991/0706    
static QLock ireclaim; 
 
1991/0705    
void 
initseg(void) 
{ 
1991/0705/sys/src/9/port/segment.c:75,801991/0706/sys/src/9/port/segment.c:78,84
1991/0705    
			s->flen = 0; 
			s->pgalloc = 0; 
			s->pgfree = 0; 
1991/0706    
			s->flushme = 0; 
1991/0705    
			memset(s->map, 0, sizeof(s->map)); 
 
			return s; 
1991/0705/sys/src/9/port/segment.c:135,1491991/0706/sys/src/9/port/segment.c:139,160
1991/0705    
	int i; 
 
	switch(s->type&SG_TYPE) { 
	case SG_TEXT:		/* new segment shares pte set */ 
1991/0706    
	case SG_TEXT:			/* New segment shares pte set */ 
1991/0705    
	case SG_SHARED: 
	case SG_PHYSICAL: 
		incref(s); 
		return s; 
	case SG_DATA:		/* copy on write both old and new plus demand load info */ 
		lock(s); 
1991/0706    
 
	case SG_BSS:			/* Just copy on write */ 
	case SG_STACK: 
		qlock(&s->lk); 
1991/0705    
		n = newseg(s->type, s->base, s->size); 
1991/0706    
		goto copypte; 
1991/0705    
 
1991/0706    
	case SG_DATA:			/* Copy on write plus demand load info */ 
		qlock(&s->lk); 
		n = newseg(s->type, s->base, s->size); 
 
1991/0705    
		incref(s->image); 
		n->image = s->image; 
		n->fstart = s->fstart; 
1991/0705/sys/src/9/port/segment.c:152,1641991/0706/sys/src/9/port/segment.c:163,172
1991/0705    
		for(i = 0; i < SEGMAPSIZE; i++) 
			if(pte = s->map[i]) 
				n->map[i] = ptecpy(pte); 
		unlock(s); 
1991/0706    
 
		n->flushme = s->flushme; 
		qunlock(&s->lk); 
1991/0705    
		return n;	 
	case SG_BSS:		/* Just copy on write */ 
	case SG_STACK: 
		lock(s); 
		n = newseg(s->type, s->base, s->size); 
		goto copypte; 
	} 
 
	panic("dupseg"); 
1991/0705/sys/src/9/port/segment.c:188,1931991/0706/sys/src/9/port/segment.c:196,202
1991/0705    
 
	lock(&imagealloc); 
 
1991/0706    
	/* Search the image cache for remains of the text from a previous incarnation */ 
1991/0705    
	for(i = ihash(c->qid.path); i; i = i->hash) { 
		if(c->qid.path == i->qid.path) { 
			lock(i); 
1991/0705/sys/src/9/port/segment.c:204,2091991/0706/sys/src/9/port/segment.c:213,219
1991/0705    
	 
	while(!(i = imagealloc.free)) { 
		unlock(&imagealloc); 
1991/0706    
		imagereclaim(); 
1991/0705    
		resrcwait("no images"); 
		lock(&imagealloc); 
	} 
1991/0705/sys/src/9/port/segment.c:236,2411991/0706/sys/src/9/port/segment.c:246,277
1991/0705    
} 
 
void 
1991/0706    
imagereclaim(void) 
{ 
	Page *p; 
 
	if(!canqlock(&ireclaim))	/* Somebody is already cleaning the page cache */ 
		return; 
 
	lock(&palloc); 
	for(p = palloc.head; p; p = p->next) { 
		if(p->image == 0) 
			continue; 
 
		unlock(&palloc); 
		lockpage(p); 
		if(p->ref == 0 && p->image != &swapimage) 
			uncachepage(p); 
		unlockpage(p); 
		lock(&palloc); 
	} 
 
	unlock(&palloc); 
 
	qunlock(&ireclaim); 
} 
 
void 
1991/0705    
putimage(Image *i) 
{ 
	Image *f, **l; 
1991/0705/sys/src/9/port/segment.c:271,2771991/0706/sys/src/9/port/segment.c:307,313
1991/0705    
} 
 
long 
ibrk(ulong addr, int seg)		/* Called with a locked segment */ 
1991/0706    
ibrk(ulong addr, int seg) 
1991/0705    
{ 
	Segment *s, *ns; 
	ulong newtop, newsize; 
1991/0705/sys/src/9/port/segment.c:427,4321991/0706/sys/src/9/port/segment.c:463,470
1991/0705    
	s = seg(u->p, arg[0], 1); 
	if(s == 0) 
		errors("bad segment address"); 
1991/0706    
 
	s->flushme = 1; 
1991/0705    
 
	soff = arg[0]-s->base; 
	j = (soff&(PTEMAPMEM-1))/BY2PG; 
1991/0706/sys/src/9/port/segment.c:214,2201991/0710/sys/src/9/port/segment.c:214,220 (short | long)
1991/0705    
	while(!(i = imagealloc.free)) { 
		unlock(&imagealloc); 
1991/0706    
		imagereclaim(); 
1991/0705    
		resrcwait("no images"); 
1991/0710    
		resrcwait(0); 
1991/0705    
		lock(&imagealloc); 
	} 
 
1991/0710/sys/src/9/port/segment.c:196,2021991/0724/sys/src/9/port/segment.c:196,205 (short | long)
1991/0705    
 
	lock(&imagealloc); 
 
1991/0706    
	/* Search the image cache for remains of the text from a previous incarnation */ 
1991/0724    
	/* 
	 * Search the image cache for remains of the text from a previous  
	 * or currently running incarnation  
	 */ 
1991/0705    
	for(i = ihash(c->qid.path); i; i = i->hash) { 
		if(c->qid.path == i->qid.path) { 
			lock(i); 
1991/0710/sys/src/9/port/segment.c:211,2161991/0724/sys/src/9/port/segment.c:214,223
1991/0705    
		} 
	} 
	 
1991/0724    
	/* 
	 * imagereclaim dumps pages from the free list which are cached by image 
	 * structures. This should free some image structures. 
	 */ 
1991/0705    
	while(!(i = imagealloc.free)) { 
		unlock(&imagealloc); 
1991/0706    
		imagereclaim(); 
1991/0710/sys/src/9/port/segment.c:241,2471991/0724/sys/src/9/port/segment.c:248,253
1991/0705    
	else 
		incref(i->s); 
 
	unlock(i); 
	return i; 
} 
 
1991/0724/sys/src/9/port/segment.c:94,1131991/0726/sys/src/9/port/segment.c:94,119 (short | long)
1991/0705    
	Pte **pp, **emap; 
	Image *i; 
 
	if(s && decref(s) == 0) { 
1991/0726    
	if(s == 0) 
		return; 
 
	i = s->image; 
	if(i && i->s == s && s->ref == 1){ 
		lock(i); 
		if(s->ref == 1) 
			i->s = 0; 
		unlock(i); 
	} 
 
	if(decref(s) == 0) { 
		if(i) 
			putimage(i); 
 
1991/0705    
		emap = &s->map[SEGMAPSIZE]; 
		for(pp = s->map; pp < emap; pp++) 
			if(*pp) 
				freepte(s, *pp); 
 
		if(i = s->image) { 
			lock(i); 
			if(i->s == s) 
				i->s = 0; 
			unlock(i); 
			putimage(i); 
		} 
                 
		lock(&segalloc); 
		s->next = segalloc.free;		 
		segalloc.free = s; 
1991/0724/sys/src/9/port/segment.c:395,4041991/0726/sys/src/9/port/segment.c:401,410
1991/0705    
					goto done; 
				j++; 
			} 
			j = 0; 
		} 
		else 
			pages -= PTEMAPMEM/BY2PG; 
1991/0726    
			pages -= PTEPERTAB-j; 
		j = 0; 
1991/0705    
	} 
done: 
	flushmmu(); 
1991/0726/sys/src/9/port/segment.c:442,4481991/0731/sys/src/9/port/segment.c:442,448 (short | long)
1991/0705    
			errors("segments overlap"); 
	} 
 
	for(ps = physseg; *(ps->name); ps++) 
1991/0731    
	for(ps = physseg; ps->name; ps++) 
1991/0705    
		if(strcmp(name, ps->name) == 0) 
			goto found; 
 
1991/0731/sys/src/9/port/segment.c:438,4441991/0803/sys/src/9/port/segment.c:438,445 (short | long)
1991/0705    
		ns = u->p->seg[i]; 
		if(ns == 0) 
			continue;	 
		if(newtop >= ns->base && newtop < ns->top)  
1991/0803    
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
1991/0705    
			errors("segments overlap"); 
	} 
 
1991/0803/sys/src/9/port/segment.c:354,3621991/0830/sys/src/9/port/segment.c:354,360 (short | long)
1991/0705    
 
	if(newsize > (PTEMAPMEM*SEGMAPSIZE)/BY2PG) { 
		qunlock(&s->lk); 
		pprint("exceeded max segment size\n"); 
		pexit("Suicide", 0); 
		error(Esegaddr); 
1991/0830    
		return -1; 
1991/0705    
	} 
 
	for(i = 0; i < NSEG; i++) { 
1991/0830/sys/src/9/port/segment.c:346,3521991/1005/sys/src/9/port/segment.c:346,351 (short | long)
1991/0705    
	newtop = PGROUND(addr); 
	newsize = (newtop-s->base)/BY2PG; 
	if(newtop < s->top) { 
		print("down brk\n"); 
		mfreeseg(s, newtop, (s->top-newtop)/BY2PG); 
		qunlock(&s->lk); 
		return 0; 
1991/1005/sys/src/9/port/segment.c:265,2841991/1024/sys/src/9/port/segment.c:265,285 (short | long)
1991/0706    
	if(!canqlock(&ireclaim))	/* Somebody is already cleaning the page cache */ 
		return; 
 
	lock(&palloc); 
	for(p = palloc.head; p; p = p->next) { 
		if(p->image == 0) 
			continue; 
1991/1024    
	for(;;) { 
		lock(&palloc); 
		for(p = palloc.head; p; p = p->next) 
			if(p->image && p->ref == 0 && p->image != &swapimage) 
				break; 
1991/0706    
 
		unlock(&palloc); 
1991/1024    
		if(p == 0) 
			break; 
 
1991/0706    
		lockpage(p); 
		if(p->ref == 0 && p->image != &swapimage) 
			uncachepage(p); 
		unlockpage(p); 
		lock(&palloc); 
	} 
                 
	unlock(&palloc); 
 
	qunlock(&ireclaim); 
} 
1991/1024/sys/src/9/port/segment.c:364,3701991/1105/sys/src/9/port/segment.c:364,369 (short | long)
1991/0705    
		if(newtop >= ns->base && newtop < ns->top) { 
			qunlock(&s->lk); 
			pprint("segments overlap\n"); 
			pexit("Suicide", 0); 
			error(Esegaddr); 
		} 
	} 
1991/1105/sys/src/9/port/segment.c:106,1111991/1109/sys/src/9/port/segment.c:106,112 (short | long)
1991/0726    
	} 
 
	if(decref(s) == 0) { 
1991/1109    
		qlock(&s->lk); 
1991/0726    
		if(i) 
			putimage(i); 
 
1991/1105/sys/src/9/port/segment.c:113,1181991/1109/sys/src/9/port/segment.c:114,121
1991/0705    
		for(pp = s->map; pp < emap; pp++) 
			if(*pp) 
				freepte(s, *pp); 
1991/1109    
 
		qunlock(&s->lk); 
1991/0705    
 
		lock(&segalloc); 
		s->next = segalloc.free;		 
1991/1109/sys/src/9/port/segment.c:418,4231991/1115/sys/src/9/port/segment.c:418,424 (short | long)
1991/0705    
	ulong newtop; 
	int i, sno; 
 
1991/1115    
	USED(p); 
1991/0705    
	if(va&KZERO)					/* BUG: Only ok for now */ 
		errors("bad virtual address"); 
 
1991/1115/sys/src/9/port/segment.c:186,1911991/1122/sys/src/9/port/segment.c:186,192 (short | long)
1991/0705    
{ 
	Pte **pte; 
	ulong off; 
1991/1122    
	Page **pg; 
1991/0705    
 
	if(p->va < s->base || p->va >= s->top) 
		panic("segpage"); 
1991/1115/sys/src/9/port/segment.c:195,2011991/1122/sys/src/9/port/segment.c:196,207
1991/0705    
	if(*pte == 0) 
		*pte = ptealloc(); 
 
	(*pte)->pages[(off&(PTEMAPMEM-1))/BY2PG] = p; 
1991/1122    
	pg = &(*pte)->pages[(off&(PTEMAPMEM-1))/BY2PG]; 
	*pg = p; 
	if(pg < (*pte)->first) 
		(*pte)->first = pg; 
	if(pg > (*pte)->last) 
		(*pte)->last = pg; 
1991/0705    
} 
 
Image* 
1991/1122/sys/src/9/port/segment.c:339,3551991/1125/sys/src/9/port/segment.c:339,355 (short | long)
1991/0705    
	if(s == 0) 
		errors("no segment"); 
 
	qlock(&s->lk); 
                 
	if(addr == 0) 
		return s->base; 
 
1991/1125    
	qlock(&s->lk); 
 
1991/0705    
	if(addr < s->base) { 
		/* We may start with the bss overlapping the data */ 
		if(seg != BSEG || u->p->seg[DSEG] == 0 || addr < u->p->seg[DSEG]->base) { 
			qunlock(&s->lk); 
			pprint("addr below segment\n"); 
 		} 
1991/1125    
			errors("addr below segment"); 
		} 
1991/0705    
		addr = s->base; 
	} 
		 
1991/1125/sys/src/9/port/segment.c:6,131991/1219/sys/src/9/port/segment.c:6,11 (short | long)
1991/0705    
#include	"ureg.h" 
#include	"errno.h" 
 
#define DPRINT 
                 
Page *lkpage(ulong addr); 
Page *snewpage(ulong addr); 
void lkpgfree(Page*); 
1991/1219/sys/src/9/port/segment.c:4,101992/0111/sys/src/9/port/segment.c:4,10 (short | long)
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005
1991/0705    
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
#include	"errno.h" 
1992/0111    
#include	"../port/error.h" 
1991/0705    
 
Page *lkpage(ulong addr); 
Page *snewpage(ulong addr); 
1992/0111/sys/src/9/port/segment.c:57,631992/0114/sys/src/9/port/segment.c:57,63 (short | long)
1991/0705    
	Segment *s; 
 
	if(size > (SEGMAPSIZE*PTEPERTAB)) 
		errors("segment too large"); 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	for(;;) { 
		lock(&segalloc); 
1992/0111/sys/src/9/port/segment.c:335,3411992/0114/sys/src/9/port/segment.c:335,341
1991/0705    
 
	s = u->p->seg[seg]; 
	if(s == 0) 
		errors("no segment"); 
1992/0114    
		error(Ebadarg); 
1991/0705    
 
	if(addr == 0) 
		return s->base; 
1992/0111/sys/src/9/port/segment.c:346,3521992/0114/sys/src/9/port/segment.c:346,352
1991/0705    
		/* We may start with the bss overlapping the data */ 
		if(seg != BSEG || u->p->seg[DSEG] == 0 || addr < u->p->seg[DSEG]->base) { 
			qunlock(&s->lk); 
1991/1125    
			errors("addr below segment"); 
1992/0114    
			error(Enovmem); 
1991/1125    
		} 
1991/0705    
		addr = s->base; 
	} 
1992/0111/sys/src/9/port/segment.c:371,3771992/0114/sys/src/9/port/segment.c:371,377
1991/0705    
		if(newtop >= ns->base && newtop < ns->top) { 
			qunlock(&s->lk); 
			pprint("segments overlap\n"); 
			error(Esegaddr); 
1992/0114    
			error(Enovmem); 
1991/0705    
		} 
	} 
 
1992/0111/sys/src/9/port/segment.c:424,4301992/0114/sys/src/9/port/segment.c:424,430
1991/0705    
 
1991/1115    
	USED(p); 
1991/0705    
	if(va&KZERO)					/* BUG: Only ok for now */ 
		errors("bad virtual address"); 
1992/0114    
		error(Ebadarg); 
1991/0705    
 
	validaddr((ulong)name, 1, 0); 
	vmemchr(name, 0, ~0); 
1992/0111/sys/src/9/port/segment.c:434,4401992/0114/sys/src/9/port/segment.c:434,440
1991/0705    
			break; 
 
	if(sno == NSEG) 
		errors("no per process segments"); 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	va = va&~(BY2PG-1); 
	len = PGROUND(len); 
1992/0111/sys/src/9/port/segment.c:445,4511992/0114/sys/src/9/port/segment.c:445,451
1991/0705    
			continue;	 
1991/0803    
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
1991/0705    
			errors("segments overlap"); 
1992/0114    
			error(Enovmem); 
1991/0705    
	} 
 
1991/0731    
	for(ps = physseg; ps->name; ps++) 
1992/0111/sys/src/9/port/segment.c:452,4611992/0114/sys/src/9/port/segment.c:452,461
1991/0705    
		if(strcmp(name, ps->name) == 0) 
			goto found; 
 
	errors("bad segment name"); 
1992/0114    
	error(Ebadarg); 
1991/0705    
found: 
	if(len > ps->size) 
		errors("segment too long"); 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	attr &= ~SG_TYPE;			/* Turn off what we are not allowed */ 
	attr |= ps->attr;			/* Copy in defaults */ 
1992/0111/sys/src/9/port/segment.c:480,4861992/0114/sys/src/9/port/segment.c:480,486
1991/0705    
 
	s = seg(u->p, arg[0], 1); 
	if(s == 0) 
		errors("bad segment address"); 
1992/0114    
		error(Ebadarg); 
1991/0706    
 
	s->flushme = 1; 
1991/0705    
 
1992/0114/sys/src/9/port/segment.c:3,91992/0120/sys/src/9/port/segment.c:3,8 (short | long)
1991/0705    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
1992/0111    
#include	"../port/error.h" 
1991/0705    
 
Page *lkpage(ulong addr); 
1992/0120/sys/src/9/port/segment.c:274,2801992/0225/sys/src/9/port/segment.c:274,282 (short | long)
1991/1024    
	for(;;) { 
		lock(&palloc); 
		for(p = palloc.head; p; p = p->next) 
			if(p->image && p->ref == 0 && p->image != &swapimage) 
1992/0225    
			if(p->image) 
			if(p->ref == 0) 
			if(p->image != &swapimage) 
1991/1024    
				break; 
1991/0706    
 
		unlock(&palloc); 
1992/0120/sys/src/9/port/segment.c:282,2881992/0225/sys/src/9/port/segment.c:284,290
1991/1024    
			break; 
 
1991/0706    
		lockpage(p); 
		if(p->ref == 0 && p->image != &swapimage) 
1992/0225    
		if(p->ref == 0) 
1991/0706    
			uncachepage(p); 
		unlockpage(p); 
	} 
1992/0225/sys/src/9/port/segment.c:148,1531992/0307/sys/src/9/port/segment.c:148,154 (short | long)
1991/0706    
	case SG_TEXT:			/* New segment shares pte set */ 
1991/0705    
	case SG_SHARED: 
	case SG_PHYSICAL: 
1992/0307    
	case SG_SHDATA: 
1991/0705    
		incref(s); 
		return s; 
1991/0706    
 
1992/0225/sys/src/9/port/segment.c:369,3751992/0307/sys/src/9/port/segment.c:370,377
1991/0705    
		ns = u->p->seg[i]; 
		if(ns == 0 || ns == s) 
			continue; 
		if(newtop >= ns->base && newtop < ns->top) { 
1992/0307    
		if(newtop >= ns->base) 
		if(newtop < ns->top) { 
1991/0705    
			qunlock(&s->lk); 
			pprint("segments overlap\n"); 
1992/0114    
			error(Enovmem); 
1992/0225/sys/src/9/port/segment.c:431,4371992/0307/sys/src/9/port/segment.c:433,440
1991/0705    
	vmemchr(name, 0, ~0); 
 
	for(sno = 0; sno < NSEG; sno++) 
		if(u->p->seg[sno] == 0 && sno != ESEG) 
1992/0307    
		if(u->p->seg[sno] == 0) 
		if(sno != ESEG) 
1991/0705    
			break; 
 
	if(sno == NSEG) 
1992/0307/sys/src/9/port/segment.c:272,2771992/0310/sys/src/9/port/segment.c:272,280 (short | long)
1991/0706    
	if(!canqlock(&ireclaim))	/* Somebody is already cleaning the page cache */ 
		return; 
 
1992/0310    
	if(conf.cntrlp) 
	print("ireclaim %lud\n", TK2MS(MACHP(0)->ticks)); 
 
1991/1024    
	for(;;) { 
		lock(&palloc); 
		for(p = palloc.head; p; p = p->next) 
1992/0307/sys/src/9/port/segment.c:289,2941992/0310/sys/src/9/port/segment.c:292,300
1991/0706    
			uncachepage(p); 
		unlockpage(p); 
	} 
1992/0310    
 
	if(conf.cntrlp) 
	print("ireclaim done %lud\n", TK2MS(MACHP(0)->ticks)); 
1991/0706    
 
	qunlock(&ireclaim); 
} 
1992/0310/sys/src/9/port/segment.c:95,1011992/0314/sys/src/9/port/segment.c:95,103 (short | long)
1991/0726    
		return; 
 
	i = s->image; 
	if(i && i->s == s && s->ref == 1){ 
1992/0314    
	if(i) 
	if(i->s == s) 
	if(s->ref == 1) { 
1991/0726    
		lock(i); 
		if(s->ref == 1) 
			i->s = 0; 
1992/0310/sys/src/9/port/segment.c:166,1711992/0314/sys/src/9/port/segment.c:168,174
1991/0705    
		n->image = s->image; 
		n->fstart = s->fstart; 
		n->flen = s->flen; 
1992/0314    
 
1991/0705    
	copypte: 
		for(i = 0; i < SEGMAPSIZE; i++) 
			if(pte = s->map[i]) 
1992/0310/sys/src/9/port/segment.c:272,3011992/0314/sys/src/9/port/segment.c:275,294
1991/0706    
	if(!canqlock(&ireclaim))	/* Somebody is already cleaning the page cache */ 
		return; 
 
1992/0310    
	if(conf.cntrlp) 
	print("ireclaim %lud\n", TK2MS(MACHP(0)->ticks)); 
                 
1991/1024    
	for(;;) { 
		lock(&palloc); 
		for(p = palloc.head; p; p = p->next) 
1992/0314    
		for(p = palloc.head; p; p = p->next) { 
1992/0225    
			if(p->image) 
			if(p->ref == 0) 
			if(p->image != &swapimage) 
1991/1024    
				break; 
1991/0706    
                 
1992/0314    
			if(p->image != &swapimage) { 
				lockpage(p); 
				if(p->ref == 0) 
					uncachepage(p); 
				unlockpage(p); 
			} 
		} 
1991/0706    
		unlock(&palloc); 
1991/1024    
		if(p == 0) 
			break; 
                 
1991/0706    
		lockpage(p); 
1992/0225    
		if(p->ref == 0) 
1991/0706    
			uncachepage(p); 
		unlockpage(p); 
	} 
1992/0310    
                 
	if(conf.cntrlp) 
	print("ireclaim done %lud\n", TK2MS(MACHP(0)->ticks)); 
1991/0706    
                 
	qunlock(&ireclaim); 
} 
 
1992/0314/sys/src/9/port/segment.c:1,51992/0321/sys/src/9/port/segment.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1991/0705    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1991/0705    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/port/segment.c:275,2941992/0404/sys/src/9/port/segment.c:275,292 (short | long)
1991/0706    
	if(!canqlock(&ireclaim))	/* Somebody is already cleaning the page cache */ 
		return; 
 
1991/1024    
	for(;;) { 
		lock(&palloc); 
1992/0314    
		for(p = palloc.head; p; p = p->next) { 
1992/0225    
			if(p->image) 
1992/0404    
	lock(&palloc); 
	for(p = palloc.head; p; p = p->next) { 
		if(p->image) 
		if(p->ref == 0) 
		if(p->image != &swapimage) { 
			lockpage(p); 
1992/0225    
			if(p->ref == 0) 
1992/0314    
			if(p->image != &swapimage) { 
				lockpage(p); 
				if(p->ref == 0) 
					uncachepage(p); 
				unlockpage(p); 
			} 
1992/0404    
				uncachepage(p); 
			unlockpage(p); 
1992/0314    
		} 
1991/0706    
		unlock(&palloc); 
	} 
1992/0404    
	unlock(&palloc); 
1991/0706    
	qunlock(&ireclaim); 
} 
 
1992/0404/sys/src/9/port/segment.c:140,1461992/0430/sys/src/9/port/segment.c:140,146 (short | long)
1991/0705    
} 
 
Segment* 
dupseg(Segment *s) 
1992/0430    
dupseg(Segment *s, int share) 
1991/0705    
{ 
	Pte *pte; 
	Segment *n; 
1992/0404/sys/src/9/port/segment.c:154,1671992/0430/sys/src/9/port/segment.c:154,183
1991/0705    
		incref(s); 
		return s; 
1991/0706    
 
	case SG_BSS:			/* Just copy on write */ 
	case SG_STACK: 
		qlock(&s->lk); 
1991/0705    
		n = newseg(s->type, s->base, s->size); 
1991/0706    
		goto copypte; 
1991/0705    
 
1992/0430    
	case SG_BSS:			/* Just copy on write */ 
		qlock(&s->lk); 
		if(share && s->ref == 1) { 
			s->type = (s->type&~SG_TYPE)|SG_SHARED; 
			incref(s); 
			qunlock(&s->lk); 
			return s; 
		} 
		n = newseg(s->type, s->base, s->size); 
		goto copypte; 
 
1991/0706    
	case SG_DATA:			/* Copy on write plus demand load info */ 
		qlock(&s->lk); 
1992/0430    
		if(share && s->ref == 1) { 
			s->type = (s->type&~SG_TYPE)|SG_SHDATA; 
			incref(s); 
			qunlock(&s->lk); 
			return s; 
		} 
1991/0706    
		n = newseg(s->type, s->base, s->size); 
 
1991/0705    
		incref(s->image); 
Too many diffs (26 > 25). Stopping.


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