diff options
| author | rsc <rsc> | 2007-08-08 09:50:26 +0000 | 
|---|---|---|
| committer | rsc <rsc> | 2007-08-08 09:50:26 +0000 | 
| commit | 3f98d050e19e6abda1c9c563009958b90bc8e250 (patch) | |
| tree | 2c5f0e9cbc9aeab96318060bd163db5597350605 | |
| parent | 9ad44da676bbc651f3727ba093a26152dd427116 (diff) | |
| download | xv6-labs-3f98d050e19e6abda1c9c563009958b90bc8e250.tar.gz xv6-labs-3f98d050e19e6abda1c9c563009958b90bc8e250.tar.bz2 xv6-labs-3f98d050e19e6abda1c9c563009958b90bc8e250.zip | |
refactor bget to be more like iget - make it clear that sleep loops
| -rw-r--r-- | bio.c | 55 | 
1 files changed, 28 insertions, 27 deletions
| @@ -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.  // In either case, return locked buffer.  static struct buf* @@ -69,34 +69,35 @@ bget(uint dev, uint sector)    acquire(&buf_table_lock); -  for(;;){ -    for(b = bufhead.next; b != &bufhead; b = b->next) -      if((b->flags & (B_BUSY|B_VALID)) && -         b->dev == dev && b->sector == sector) -        break; - -    if(b != &bufhead){ -      if(b->flags & B_BUSY){ -        sleep(buf, &buf_table_lock); -      } else { -        b->flags |= B_BUSY; -        // b->flags &= ~B_VALID; // Force reread from disk -        release(&buf_table_lock); -        return b; -      } -    } else { -      for(b = bufhead.prev; b != &bufhead; b = b->prev){ -        if((b->flags & B_BUSY) == 0){ -          b->flags = B_BUSY; -          b->dev = dev; -          b->sector = sector; -          release(&buf_table_lock); -          return b; -        } -      } -      panic("bget: no buffers"); + loop: +  // Try for cached block. +  for(b = bufhead.next; b != &bufhead; b = b->next) +    if((b->flags & (B_BUSY|B_VALID)) && +       b->dev == dev && b->sector == sector) +      break; + +  if(b != &bufhead){ +    if(b->flags & B_BUSY){ +      sleep(buf, &buf_table_lock); +      goto loop; +    } +    b->flags |= B_BUSY; +    // b->flags &= ~B_VALID; // Force reread from disk +    release(&buf_table_lock); +    return b; +  } + +  // Allocate fresh block. +  for(b = bufhead.prev; b != &bufhead; b = b->prev){ +    if((b->flags & B_BUSY) == 0){ +      b->flags = B_BUSY; +      b->dev = dev; +      b->sector = sector; +      release(&buf_table_lock); +      return b;      }    } +  panic("bget: no buffers");  }  // Read buf's contents from disk. | 
