@@ -193,7 +193,8 @@ impl MultiUseSandbox {
193
193
#[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
194
194
pub ( crate ) fn restore_state ( & mut self ) -> Result < ( ) > {
195
195
let mem_mgr = self . mem_mgr . unwrap_mgr_mut ( ) ;
196
- mem_mgr. restore_state_from_last_snapshot ( )
196
+ let dirty_pages = self . vm . get_and_clear_dirty_pages ( ) ?;
197
+ mem_mgr. restore_state_from_last_snapshot ( & dirty_pages)
197
198
}
198
199
199
200
pub ( crate ) fn call_guest_function_by_name_no_reset (
@@ -275,9 +276,10 @@ impl DevolvableSandbox<MultiUseSandbox, MultiUseSandbox, Noop<MultiUseSandbox, M
275
276
/// The devolve can be used to return the MultiUseSandbox to the state before the code was loaded. Thus avoiding initialisation overhead
276
277
#[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
277
278
fn devolve ( mut self , _tsn : Noop < MultiUseSandbox , MultiUseSandbox > ) -> Result < MultiUseSandbox > {
279
+ let dirty_pages = self . vm . get_and_clear_dirty_pages ( ) ?;
278
280
self . mem_mgr
279
281
. unwrap_mgr_mut ( )
280
- . pop_and_restore_state_from_snapshot ( ) ?;
282
+ . pop_and_restore_state_from_snapshot ( & dirty_pages ) ?;
281
283
Ok ( self )
282
284
}
283
285
}
@@ -308,7 +310,10 @@ where
308
310
let mut ctx = self . new_call_context ( ) ;
309
311
transition_func. call ( & mut ctx) ?;
310
312
let mut sbox = ctx. finish_no_reset ( ) ;
311
- sbox. mem_mgr . unwrap_mgr_mut ( ) . push_state ( ) ?;
313
+ let vm_dirty_pages = sbox. vm . get_and_clear_dirty_pages ( ) ?;
314
+ sbox. mem_mgr
315
+ . unwrap_mgr_mut ( )
316
+ . push_state ( Some ( & vm_dirty_pages) ) ?;
312
317
Ok ( sbox)
313
318
}
314
319
}
0 commit comments