#include <xbt/mmalloc.h>
+#define SOFT_DIRTY_BIT_NUMBER 55
+#define SOFT_DIRTY (((uint64_t)1) << SOFT_DIRTY_BIT_NUMBER)
+
using simgrid::mc::remote;
namespace simgrid {
* @return Snapshot page numbers of this new snapshot
*/
PerPageCopy::PerPageCopy(PageStore& store, AddressSpace& as,
- remote_ptr<void> addr, std::size_t page_count)
+ remote_ptr<void> addr, std::size_t page_count,
+ const size_t* ref_page_numbers, const std::uint64_t* pagemap)
{
store_ = &store;
this->pagenos_.resize(page_count);
for (size_t i = 0; i != page_count; ++i) {
+ // We don't have to compare soft-clean pages:
+ if (ref_page_numbers && pagemap && !(pagemap[i] & SOFT_DIRTY)) {
+ pagenos_[i] = ref_page_numbers[i];
+ store_->ref_page(ref_page_numbers[i]);
+ continue;
+ }
+
remote_ptr<void> page = remote(addr.address() + (i << xbt_pagebits));
xbt_assert(mc_page_offset((void*)page.address())==0,
"Not at the beginning of a page");