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

1999/0806/mpc/devsac.c (diff list | history)

1999/0727/sys/src/9/mpc/devsac.c:17,221999/0806/sys/src/9/mpc/devsac.c:17,23 (short | long | prev | next)
1999/0608    
{ 
	OPERM	= 0x3,		/* mask of all permission types in open mode */ 
	Nram	= 512, 
1999/0806    
	CacheSize = 20, 
1999/0608    
}; 
 
typedef struct SacPath SacPath; 
1999/0727/sys/src/9/mpc/devsac.c:23,281999/0806/sys/src/9/mpc/devsac.c:24,30
1999/0608    
typedef struct Sac Sac; 
typedef struct SacHeader SacHeader; 
typedef struct SacDir SacDir; 
1999/0806    
typedef struct Cache Cache; 
1999/0608    
 
enum { 
	Magic = 0x5acf5, 
1999/0727/sys/src/9/mpc/devsac.c:64,691999/0806/sys/src/9/mpc/devsac.c:66,78
1999/0608    
	int entry; 
}; 
 
1999/0806    
struct Cache 
{ 
	long block; 
	ulong age; 
	uchar *data; 
}; 
 
1999/0608    
enum 
{ 
	Pexec =		1, 
1999/0727/sys/src/9/mpc/devsac.c:77,821999/0806/sys/src/9/mpc/devsac.c:86,93
1999/0609    
static uchar *data = SACMEM; 
static int blocksize; 
static Sac root; 
1999/0806    
static Cache cache[CacheSize]; 
static ulong cacheage; 
1999/0608    
 
1999/0609    
static void	sacdir(Chan *, SacDir*, char*); 
static ulong	getl(void *p); 
1999/0727/sys/src/9/mpc/devsac.c:91,961999/0806/sys/src/9/mpc/devsac.c:102,110
1999/0609    
sacinit(void) 
1999/0608    
{ 
	SacHeader *hdr; 
1999/0806    
	uchar *p; 
	int i; 
 
1999/0609    
print("sacinit\n"); 
1999/0608    
	hdr = (SacHeader*)data; 
	if(getl(hdr->magic) != Magic) { 
1999/0727/sys/src/9/mpc/devsac.c:99,1041999/0806/sys/src/9/mpc/devsac.c:113,125
1999/0608    
	} 
	blocksize = getl(hdr->blocksize); 
	root.SacDir = *(SacDir*)(data + sizeof(SacHeader)); 
1999/0806    
	p = malloc(CacheSize*blocksize); 
	if(p == nil) 
		error("allocating cache"); 
	for(i=0; i<CacheSize; i++) { 
		cache[i].data = p; 
		p += blocksize; 
	} 
1999/0608    
} 
 
static Chan* 
1999/0727/sys/src/9/mpc/devsac.c:310,3191999/0806/sys/src/9/mpc/devsac.c:331,362
1999/0608    
loadblock(void *buf, uchar *offset, int blocksize) 
{ 
	vlong block, n; 
1999/0806    
	ulong age; 
	int i, j; 
1999/0608    
 
	block = getv(offset); 
	if(block < 0) { 
		block = -block; 
1999/0806    
		cacheage++; 
		// age has wraped 
		if(cacheage == 0) { 
			for(i=0; i<CacheSize; i++) 
				cache[i].age = 0; 
		} 
		j = 0; 
		age = cache[0].age; 
		for(i=0; i<CacheSize; i++) { 
			if(cache[i].age < age) { 
				age = cache[i].age; 
				j = i; 
			} 
			if(cache[i].block != block) 
				continue; 
			memmove(buf, cache[i].data, blocksize); 
			cache[i].age = cacheage; 
			return; 
		} 
 
1999/0608    
		n = getv(offset+8); 
		if(n < 0) 
			n = -n; 
1999/0727/sys/src/9/mpc/devsac.c:320,3251999/0806/sys/src/9/mpc/devsac.c:363,371
1999/0608    
		n -= block; 
		if(unsac(buf, data+block, blocksize, n)<0) 
			panic("unsac failed!"); 
1999/0806    
		memmove(cache[j].data, buf, blocksize); 
		cache[j].age = cacheage; 
		cache[j].block = block; 
1999/0608    
	} else { 
		memmove(buf, data+block, blocksize); 
	} 


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