提交 3f98d050 创建 作者: rsc's avatar rsc

refactor bget to be more like iget - make it clear that sleep loops

上级 9ad44da6
...@@ -59,7 +59,7 @@ binit(void) ...@@ -59,7 +59,7 @@ binit(void)
} }
} }
// Look through buffer cache for block n on device dev. // Look through buffer cache for sector on device dev.
// If not found, allocate fresh block. // If not found, allocate fresh block.
// In either case, return locked buffer. // In either case, return locked buffer.
static struct buf* static struct buf*
...@@ -69,34 +69,35 @@ bget(uint dev, uint sector) ...@@ -69,34 +69,35 @@ bget(uint dev, uint sector)
acquire(&buf_table_lock); acquire(&buf_table_lock);
for(;;){ loop:
for(b = bufhead.next; b != &bufhead; b = b->next) // Try for cached block.
if((b->flags & (B_BUSY|B_VALID)) && for(b = bufhead.next; b != &bufhead; b = b->next)
b->dev == dev && b->sector == sector) if((b->flags & (B_BUSY|B_VALID)) &&
break; b->dev == dev && b->sector == sector)
break;
if(b != &bufhead){
if(b->flags & B_BUSY){ if(b != &bufhead){
sleep(buf, &buf_table_lock); if(b->flags & B_BUSY){
} else { sleep(buf, &buf_table_lock);
b->flags |= B_BUSY; goto loop;
// b->flags &= ~B_VALID; // Force reread from disk }
release(&buf_table_lock); b->flags |= B_BUSY;
return b; // b->flags &= ~B_VALID; // Force reread from disk
} release(&buf_table_lock);
} else { return b;
for(b = bufhead.prev; b != &bufhead; b = b->prev){ }
if((b->flags & B_BUSY) == 0){
b->flags = B_BUSY; // Allocate fresh block.
b->dev = dev; for(b = bufhead.prev; b != &bufhead; b = b->prev){
b->sector = sector; if((b->flags & B_BUSY) == 0){
release(&buf_table_lock); b->flags = B_BUSY;
return b; b->dev = dev;
} b->sector = sector;
} release(&buf_table_lock);
panic("bget: no buffers"); return b;
} }
} }
panic("bget: no buffers");
} }
// Read buf's contents from disk. // Read buf's contents from disk.
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论