@@ -163,9 +163,10 @@ impl LinuxDirtyPageTracker {
163163        } ) 
164164    } 
165165
166-     /// Get all dirty page indices for this tracker 
167- pub ( super )  fn  get_dirty_pages ( self )  -> Vec < usize >  { 
168-         let  res = if  let  Some ( tracker_data)  = get_trackers ( ) . get ( & self . id )  { 
166+     /// Get all dirty page indices for this tracker. 
167+ /// NOTE: This is not a bitmap, but a vector of indices where each index corresponds to a page that has been written to. 
168+ fn  get_dirty_pages ( & self )  -> Result < Vec < usize > >  { 
169+         let  res:  Vec < usize >  = if  let  Some ( tracker_data)  = get_trackers ( ) . get ( & self . id )  { 
169170            let  mut  dirty_pages = Vec :: new ( ) ; 
170171            let  tracker_data = tracker_data. val ( ) ; 
171172            for  ( idx,  dirty)  in  tracker_data. dirty_pages . iter ( ) . enumerate ( )  { 
@@ -175,13 +176,20 @@ impl LinuxDirtyPageTracker {
175176            } 
176177            dirty_pages
177178        }  else  { 
178-             Vec :: new ( ) 
179+             return  Err ( new_error ! ( 
180+                 "Tried to get dirty pages from tracker, but no tracker data found" 
181+             ) ) ; 
179182        } ; 
180183
181-         // self is dropped here, triggering cleanup 
184+         Ok ( res) 
185+     } 
186+ 
187+     /// Uninstall the tracker and return the dirty pages 
188+ pub ( super )  fn  uninstall ( self )  -> Result < Vec < usize > >  { 
189+         let  dirty_pages = self . get_dirty_pages ( ) ?; 
182190        // explicit to document intent 
183191        drop ( self ) ; 
184-         res 
192+         Ok ( dirty_pages ) 
185193    } 
186194
187195    #[ cfg( test) ]  
@@ -793,7 +801,7 @@ mod tests {
793801        let  addr = memory_ptr as  usize ; 
794802
795803        let  tracker = create_test_tracker ( addr,  memory_size) . unwrap ( ) ; 
796-         let  dirty_pages = tracker. get_dirty_pages ( ) ; 
804+         let  dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ; 
797805        assert ! ( dirty_pages. is_empty( ) ) ; 
798806
799807        // tracker is already dropped by get_dirty_pages() call above 
@@ -831,7 +839,7 @@ mod tests {
831839            } 
832840        } 
833841
834-         let  dirty_pages = tracker. get_dirty_pages ( ) ; 
842+         let  dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ; 
835843
836844        println ! ( "Dirty Pages expected: {:?}" ,  pages_to_dirty) ; 
837845        println ! ( "Dirty pages found: {:?}" ,  dirty_pages) ; 
@@ -876,8 +884,8 @@ mod tests {
876884            std:: ptr:: write_volatile ( ( addr2 + PAGE_SIZE  + 200 )  as  * mut  u8 ,  2 ) ; 
877885        } 
878886
879-         let  dirty1 = tracker1. get_dirty_pages ( ) ; 
880-         let  dirty2 = tracker2. get_dirty_pages ( ) ; 
887+         let  dirty1 = tracker1. get_dirty_pages ( ) . unwrap ( ) ; 
888+         let  dirty2 = tracker2. get_dirty_pages ( ) . unwrap ( ) ; 
881889
882890        // Verify each tracker only reports pages that were actually written to 
883891        // Tracker1: wrote to offset 100, which is in page 0 
@@ -956,7 +964,7 @@ mod tests {
956964            } 
957965        } 
958966
959-         let  dirty_pages = tracker. get_dirty_pages ( ) ; 
967+         let  dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ; 
960968
961969        // All writes to the same page should result in the same page being dirty 
962970        if  !dirty_pages. is_empty ( )  { 
@@ -1036,7 +1044,7 @@ mod tests {
10361044                } 
10371045
10381046                // Final verification: check that ALL pages we wrote to are marked as dirty 
1039-                 let  final_dirty_pages = tracker. get_dirty_pages ( ) ; 
1047+                 let  final_dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ; 
10401048
10411049                // Check that every page we wrote to is marked as dirty 
10421050                for  & page_idx in  & pages_written { 
@@ -1198,7 +1206,7 @@ mod tests {
11981206            } 
11991207        } 
12001208
1201-         let  dirty_pages = tracker. get_dirty_pages ( ) ; 
1209+         let  dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ; 
12021210        println ! ( "Stress test dirty pages: {:?}" ,  dirty_pages) ; 
12031211
12041212        // Verify all page indices are valid 
0 commit comments