@@ -45,7 +45,7 @@ impl DerefMut for BufferBlockWrapper {
4545pub struct BufferGuard {
4646 dev : u32 ,
4747 block_number : u32 ,
48- index : i32 ,
48+ index : usize ,
4949 buffer : Arc < Mutex < BufferBlockWrapper > > ,
5050 bcache : & ' static BufferCache ,
5151}
@@ -60,19 +60,19 @@ impl BufferGuard {
6060 }
6161
6262 pub fn pin ( & self ) {
63- self . bcache . pin ( self . index as usize )
63+ self . bcache . pin ( self . index )
6464 }
6565
6666 pub fn unpin ( & self ) {
67- self . bcache . unpin ( self . index as usize )
67+ self . bcache . unpin ( self . index )
6868 }
6969}
7070
7171// I could've get a reference to the bcache and do a brelse explicitly when the guard is dropped.
7272// But I don't want to deal with the lifetime for now. Might do it later
7373impl Drop for BufferGuard {
7474 fn drop ( & mut self ) {
75- assert ! ( self . index < 0 , "You forgot to release the buffer back to the bcache" ) ;
75+ self . bcache . release ( self . index )
7676 }
7777}
7878
@@ -147,15 +147,15 @@ impl BufferCacheInternal {
147147 // look through buffer cache, return the buffer
148148 // If the block does not exist, we preempt a not-in-use one
149149 // We let the caller to lock the buffer when they need to use it
150- fn get ( & mut self , dev : u32 , block_number : u32 ) -> ( bool , i32 , Arc < Mutex < BufferBlockWrapper > > ) {
150+ fn get ( & mut self , dev : u32 , block_number : u32 ) -> ( bool , usize , Arc < Mutex < BufferBlockWrapper > > ) {
151151 // println!("{:?} {:?}", &(dev, block_number), self.map.get(&(dev, block_number)));
152152 match self . map . get ( & ( dev, block_number) ) {
153153 Some ( index) => {
154154 let buffer = & mut self . buffers [ * index] ;
155155 assert ! ( buffer. dev == dev) ;
156156 assert ! ( buffer. block_number == block_number) ;
157157 buffer. reference_count += 1 ;
158- ( true , * index as i32 , buffer. data . clone ( ) )
158+ ( true , * index, buffer. data . clone ( ) )
159159 } ,
160160 None => {
161161 // Not cached; recycle an unused buffer.
@@ -173,7 +173,7 @@ impl BufferCacheInternal {
173173 buffer. block_number = block_number;
174174 buffer. reference_count = 1 ;
175175 assert ! ( self . map. insert( ( dev, block_number) , curr as usize ) . is_none( ) ) ;
176- return ( false , curr, buffer. data . clone ( ) )
176+ return ( false , curr as usize , buffer. data . clone ( ) )
177177 }
178178 curr = buffer. prev ;
179179 }
@@ -254,9 +254,8 @@ impl BufferCache {
254254 // This is confusing since it doesn't match xv6's brelse exactly so there could be a bug.
255255 // Check xv6 for details
256256 // TODO(tianjiao): fix this
257- pub fn release ( & self , guard : & mut BufferGuard ) {
258- self . internal . lock ( ) . release ( guard. index as usize ) ;
259- guard. index = -1 ;
257+ fn release ( & self , index : usize ) {
258+ self . internal . lock ( ) . release ( index) ;
260259 }
261260
262261 fn pin ( & self , index : usize ) {
0 commit comments