| 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,22 – 1999/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,28 – 1999/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,69 – 1999/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,82 – 1999/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,96 – 1999/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,104 – 1999/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,319 – 1999/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,325 – 1999/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); } | |