X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c91e95dd481317b70cb360fa12ab753584864848..66248ebaa3e1745f85dfa34c56ff0f16fb874c13:/src/mc/mc_snapshot.c diff --git a/src/mc/mc_snapshot.c b/src/mc/mc_snapshot.c index 38820c93b3..c733664f01 100644 --- a/src/mc/mc_snapshot.c +++ b/src/mc/mc_snapshot.c @@ -24,6 +24,8 @@ mc_mem_region_t mc_get_snapshot_region(void* addr, mc_snapshot_t snapshot) void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region) { + xbt_assert(mc_region_contain(region, (void*) addr), "Trying to read out of the region boundary."); + if (!region) { return (void *) addr; } @@ -71,20 +73,22 @@ static void* mc_snapshot_read_fragmented(void* addr, mc_mem_region_t region, voi { void* end = (char*) addr + size - 1; size_t page_end = mc_page_number(NULL, end); + void* dest = target; // Read each page: while (mc_page_number(NULL, addr) != page_end) { void* snapshot_addr = mc_translate_address_region((uintptr_t) addr, region); void* next_page = mc_page_from_number(NULL, mc_page_number(NULL, addr) + 1); size_t readable = (char*) next_page - (char*) addr; - memcpy(target, snapshot_addr, readable); - target = (char*) target + readable; + memcpy(dest, snapshot_addr, readable); + addr = (char*) addr + readable; + dest = (char*) dest + readable; size -= readable; } // Read the end: void* snapshot_addr = mc_translate_address_region((uintptr_t)addr, region); - memcpy(target, snapshot_addr, size); + memcpy(dest, snapshot_addr, size); return target; } @@ -101,9 +105,8 @@ void* mc_snapshot_read_region(void* addr, mc_mem_region_t region, void* target, { uintptr_t offset = (uintptr_t) addr - (uintptr_t) region->start_addr; - if (addr < region->start_addr || (char*) addr+size >= (char*)region->start_addr+region->size) { - xbt_die("Trying to read out of the region boundary."); - } + xbt_assert(addr >= region->start_addr && (char*) addr+size < (char*)region->start_addr+region->size, + "Trying to read out of the region boundary."); // Linear memory region: if (region->data) { @@ -145,10 +148,40 @@ void* mc_snapshot_read(void* addr, mc_snapshot_t snapshot, void* target, size_t } } +/** Compare memory between snapshots (with known regions) + * + * @param addr1 Address in the first snapshot + * @param snapshot2 Region of the address in the first snapshot + * @param addr2 Address in the second snapshot + * @param snapshot2 Region of the address in the second snapshot + * @return same as memcmp + * */ +int mc_snapshot_region_memcp( + void* addr1, mc_mem_region_t region1, + void* addr2, mc_mem_region_t region2, size_t size) +{ + // TODO, optimize this, avoid alloca + void* buffer1 = mc_snapshot_read_region(addr1, region1, alloca(size), size); + void* buffer2 = mc_snapshot_read_region(addr2, region2, alloca(size), size); + if (buffer1 == buffer2) { + return 0; + } + return memcmp(buffer1, buffer2, size); +} + +/** Compare memory between snapshots + * + * @param addr1 Address in the first snapshot + * @param snapshot1 First snapshot + * @param addr2 Address in the second snapshot + * @param snapshot2 Second snapshot + * @return same as memcmp + * */ int mc_snapshot_memcp( void* addr1, mc_snapshot_t snapshot1, void* addr2, mc_snapshot_t snapshot2, size_t size) { + // TODO, optimize this, avoid alloca void* buffer1 = mc_snapshot_read(addr1, snapshot1, alloca(size), size); void* buffer2 = mc_snapshot_read(addr2, snapshot2, alloca(size), size); if (buffer1 == buffer2) {