@@ -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+ pub ( super ) 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,15 @@ 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
182184 // explicit to document intent
183185 drop ( self ) ;
184- res
186+
187+ Ok ( res)
185188 }
186189
187190 #[ cfg( test) ]
@@ -793,7 +796,7 @@ mod tests {
793796 let addr = memory_ptr as usize ;
794797
795798 let tracker = create_test_tracker ( addr, memory_size) . unwrap ( ) ;
796- let dirty_pages = tracker. get_dirty_pages ( ) ;
799+ let dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ;
797800 assert ! ( dirty_pages. is_empty( ) ) ;
798801
799802 // tracker is already dropped by get_dirty_pages() call above
@@ -831,7 +834,7 @@ mod tests {
831834 }
832835 }
833836
834- let dirty_pages = tracker. get_dirty_pages ( ) ;
837+ let dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ;
835838
836839 println ! ( "Dirty Pages expected: {:?}" , pages_to_dirty) ;
837840 println ! ( "Dirty pages found: {:?}" , dirty_pages) ;
@@ -876,8 +879,8 @@ mod tests {
876879 std:: ptr:: write_volatile ( ( addr2 + PAGE_SIZE + 200 ) as * mut u8 , 2 ) ;
877880 }
878881
879- let dirty1 = tracker1. get_dirty_pages ( ) ;
880- let dirty2 = tracker2. get_dirty_pages ( ) ;
882+ let dirty1 = tracker1. get_dirty_pages ( ) . unwrap ( ) ;
883+ let dirty2 = tracker2. get_dirty_pages ( ) . unwrap ( ) ;
881884
882885 // Verify each tracker only reports pages that were actually written to
883886 // Tracker1: wrote to offset 100, which is in page 0
@@ -956,7 +959,7 @@ mod tests {
956959 }
957960 }
958961
959- let dirty_pages = tracker. get_dirty_pages ( ) ;
962+ let dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ;
960963
961964 // All writes to the same page should result in the same page being dirty
962965 if !dirty_pages. is_empty ( ) {
@@ -1036,7 +1039,7 @@ mod tests {
10361039 }
10371040
10381041 // Final verification: check that ALL pages we wrote to are marked as dirty
1039- let final_dirty_pages = tracker. get_dirty_pages ( ) ;
1042+ let final_dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ;
10401043
10411044 // Check that every page we wrote to is marked as dirty
10421045 for & page_idx in & pages_written {
@@ -1198,7 +1201,7 @@ mod tests {
11981201 }
11991202 }
12001203
1201- let dirty_pages = tracker. get_dirty_pages ( ) ;
1204+ let dirty_pages = tracker. get_dirty_pages ( ) . unwrap ( ) ;
12021205 println ! ( "Stress test dirty pages: {:?}" , dirty_pages) ;
12031206
12041207 // Verify all page indices are valid
0 commit comments