diff --git a/Notes b/Notes index 3efafb32f6fe49f73f649f61e1f50fe4a5a78331..e1d763dbd7bf0d89c3619d40be03381e6ec45882 100644 --- a/Notes +++ b/Notes @@ -354,3 +354,6 @@ HMM maybe the variables at the end of struct cpu are being overwritten OH! recursive interrupts will use up any amount of cpu[].stack! underflow and wrecks *previous* cpu's struct + +better buffer cache replacement +read/write of open file that's been unlinked diff --git a/bio.c b/bio.c index 7184a283340fdb4041d10174ee6285b4b2401d81..2db9694954ffb72d1f933fc02435b23cfc5228b6 100644 --- a/bio.c +++ b/bio.c @@ -20,20 +20,31 @@ struct buf * getblk(uint dev, uint sector) { struct buf *b; + static struct buf *scan = buf; + int i; acquire(&buf_table_lock); while(1){ for(b = buf; b < buf+NBUF; b++) - if((b->flags & B_BUSY) && b->dev == dev && b->sector) + if((b->flags & (B_BUSY|B_VALID)) && b->dev == dev && b->sector == sector) break; if(b < buf+NBUF){ - sleep(buf, &buf_table_lock); + if(b->flags & B_BUSY){ + sleep(buf, &buf_table_lock); + } else { + b->flags |= B_BUSY; + release(&buf_table_lock); + return b; + } } else { - for(b = buf; b < buf+NBUF; b++){ + for(i = 0; i < NBUF; i++){ + b = scan++; + if(scan >= buf+NBUF) + scan = buf; if((b->flags & B_BUSY) == 0){ - b->flags |= B_BUSY; + b->flags = B_BUSY; b->dev = dev; b->sector = sector; release(&buf_table_lock); @@ -53,11 +64,14 @@ bread(uint dev, uint sector) extern struct spinlock ide_lock; b = getblk(dev, sector); + if(b->flags & B_VALID) + return b; acquire(&ide_lock); c = ide_start_rw(dev & 0xff, sector, b->data, 1, 1); sleep (c, &ide_lock); ide_finish(c); + b->flags |= B_VALID; release(&ide_lock); return b; @@ -73,6 +87,7 @@ bwrite(uint dev, struct buf *b, uint sector) c = ide_start_rw(dev & 0xff, sector, b->data, 1, 0); sleep (c, &ide_lock); ide_finish(c); + b->flags |= B_VALID; release(&ide_lock); } diff --git a/buf.h b/buf.h index e3f6b143f4c605494fb7058ee68e878679a63d80..7ab352a68c7a5ec15e32b4a3d5ce72c8dfa07a59 100644 --- a/buf.h +++ b/buf.h @@ -5,3 +5,4 @@ struct buf { uchar data[512]; }; #define B_BUSY 0x1 +#define B_VALID 0x2 diff --git a/usertests.c b/usertests.c index a3bb2848b337b968a2fc404ab7b448d69f92d732..9bd144c6cad7143d5b0f56737fcd45fffa63654b 100644 --- a/usertests.c +++ b/usertests.c @@ -339,7 +339,7 @@ main(int argc, char *argv[]) { puts("usertests starting\n"); - unlinkread(); + //unlinkread(); createdelete(); twofiles(); sharedfd();