-/* Copyright (c) 2008-2016. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2008-2017. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-/** \file mc_compare.cpp Memory snapshooting and comparison */
+/** \file compare.cpp Memory snapshooting and comparison */
#include <cinttypes>
#include "src/internal_config.h"
#include "src/xbt/mmalloc/mmprivate.h"
-#include "src/xbt/ex_interface.h"
#if HAVE_SMPI
#include "src/smpi/private.h"
static inline
HeapLocationPair makeHeapLocationPair(int block1, int fragment1, int block2, int fragment2)
{
- return simgrid::mc::HeapLocationPair({
+ return simgrid::mc::HeapLocationPair{{
simgrid::mc::HeapLocation(block1, fragment1),
simgrid::mc::HeapLocation(block2, fragment2)
- });
+ }};
}
struct HeapArea : public HeapLocation {
/** Check whether two blocks are known to be matching
*
- * @param state State used
* @param b1 Block of state 1
* @param b2 Block of state 2
* @return if the blocks are known to be matching
/** Check whether two fragments are known to be matching
*
- * @param state State used
* @param b1 Block of state 1
* @param f1 Fragment of state 1
* @param b2 Block of state 2
}
if (i1 == state.heaplimit)
- XBT_DEBUG("Number of blocks/fragments not found in heap1 : %d", nb_diff1);
+ XBT_DEBUG("Number of blocks/fragments not found in heap1: %d", nb_diff1);
for (i=1; i < state.heaplimit; i++) {
const malloc_info* heapinfo2 = (const malloc_info*) MC_region_read(
}
if (i1 == state.heaplimit)
- XBT_DEBUG("Number of blocks/fragments not found in heap2 : %d", nb_diff2);
+ XBT_DEBUG("Number of blocks/fragments not found in heap2: %d", nb_diff2);
return nb_diff1 > 0 || nb_diff2 > 0;
}
return nullptr;
default:
- /* FIXME : other cases ? */
+ /* FIXME: other cases ? */
return nullptr;
}
int new_size1 = -1, new_size2 = -1;
simgrid::mc::Type *new_type1 = nullptr, *new_type2 = nullptr;
- int match_pairs = 0;
+ bool match_pairs = false;
// This is the address of std_heap->heapinfo in the application process:
void* heapinfo_address = &((xbt_mheap_t) process->heap_address)->heapinfo;
malloc_info heapinfo_temp1, heapinfo_temp2;
+ simgrid::mc::HeapLocationPairs current;
if (previous == nullptr) {
- previous = new HeapLocationPairs();
- match_pairs = 1;
+ previous = ¤t;
+ match_pairs = true;
}
// Get block number:
if (is_block_stack((int) block1) && is_block_stack((int) block2)) {
previous->insert(simgrid::mc::makeHeapLocationPair(
block1, -1, block2, -1));
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
|| (block1 > (ssize_t) state.processStates[0].heapsize) || (block1 < 1)
|| ((char *) area2 < (char *) state.std_heap_copy.heapbase)
|| (block2 > (ssize_t) state.processStates[1].heapsize) || (block2 < 1)) {
- if (match_pairs)
- delete previous;
return 1;
}
if ((heapinfo1->type == MMALLOC_TYPE_FREE || heapinfo1->type==MMALLOC_TYPE_HEAPINFO)
&& (heapinfo2->type == MMALLOC_TYPE_FREE || heapinfo2->type ==MMALLOC_TYPE_HEAPINFO)) {
/* Free block */
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
if (state.equals_to1_(block1, 0).valid
&& state.equals_to2_(block2, 0).valid
&& state.blocksEqual(block1, block2)) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
if (type_size != (ssize_t) heapinfo1->busy_block.busy_size
&& type_size != (ssize_t) heapinfo2->busy_block.busy_size
&& (type->name.empty() || type->name == "struct s_smx_context")) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return -1;
}
}
- if (heapinfo1->busy_block.size != heapinfo2->busy_block.size) {
- if (match_pairs)
- delete previous;
+ if (heapinfo1->busy_block.size != heapinfo2->busy_block.size)
return 1;
- }
-
- if (heapinfo1->busy_block.busy_size != heapinfo2->busy_block.busy_size) {
- if (match_pairs)
- delete previous;
+ if (heapinfo1->busy_block.busy_size != heapinfo2->busy_block.busy_size)
return 1;
- }
if (!previous->insert(simgrid::mc::makeHeapLocationPair(
block1, -1, block2, -1)).second) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
state.types2_(block2, 0) = type;
if (size <= 0) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
if (type_size != -1) {
if (heapinfo1->busy_frag.frag_size[frag1] == -1
|| heapinfo2->busy_frag.frag_size[frag2] == -1) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return -1;
}
// ?
if (type_size != heapinfo1->busy_frag.frag_size[frag1]
|| type_size != heapinfo2->busy_frag.frag_size[frag2]) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return -1;
}
}
if (state.equals_to1_(block1, frag1).valid
&& state.equals_to2_(block2, frag2).valid) {
if (offset1==offset2 && state.fragmentsEqual(block1, frag1, block2, frag2)) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
}
if (heapinfo1->busy_frag.frag_size[frag1] !=
heapinfo2->busy_frag.frag_size[frag2]) {
if (type_size == -1) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return -1;
- } else {
- if (match_pairs)
- delete previous;
+ } else
return 1;
- }
}
// Size of the fragment:
get_offset_type(real_addr_frag2, state.types2_(block2, frag2),
offset2, size, snapshot2, process_index);
} else {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return -1;
}
new_size2 = type->byte_size;
} else {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return -1;
}
}
if (offset1 == 0 && offset2 == 0
&& !previous->insert(simgrid::mc::makeHeapLocationPair(
block1, frag1, block2, frag2)).second) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
if (size <= 0) {
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
return 0;
}
heapinfo1->busy_frag.ignore[frag1]))
check_ignore = heapinfo1->busy_frag.ignore[frag1];
- } else {
- if (match_pairs)
- delete previous;
+ } else
return 1;
- }
/* Start comparison */
compare_heap_area_without_type(state, process_index, area1, area2, snapshot1, snapshot2,
previous, size, check_ignore);
- if (res_compare == 1) {
- if (match_pairs)
- delete previous;
+ if (res_compare == 1)
return res_compare;
- }
- if (match_pairs) {
+ if (match_pairs)
state.match_equals(previous);
- delete previous;
- }
-
return 0;
}
return -1;
break;
default:
- XBT_VERB("Unknown case : %d", type->type);
+ XBT_VERB("Unknown case: %d", type->type);
break;
}
if (_sg_mc_hash) {
hash_result = (s1->hash != s2->hash);
if (hash_result) {
- XBT_VERB("(%d - %d) Different hash : 0x%" PRIx64 "--0x%" PRIx64, num1,
- num2, s1->hash, s2->hash);
+ XBT_VERB("(%d - %d) Different hash: 0x%" PRIx64 "--0x%" PRIx64, num1, num2, s1->hash, s2->hash);
#ifndef MC_DEBUG
return 1;
#endif
} else
- XBT_VERB("(%d - %d) Same hash : 0x%" PRIx64, num1, num2, s1->hash);
+ XBT_VERB("(%d - %d) Same hash: 0x%" PRIx64, num1, num2, s1->hash);
}
/* Compare enabled processes */
size_used2 = s2->stack_sizes[i];
if (size_used1 != size_used2) {
#ifdef MC_DEBUG
- XBT_DEBUG("(%d - %d) Different size used in stacks : %zu - %zu", num1,
- num2, size_used1, size_used2);
+ XBT_DEBUG("(%d - %d) Different size used in stacks: %zu - %zu", num1, num2, size_used1, size_used2);
errors++;
is_diff = 1;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different size used in stacks : %zu - %zu", num1,
- num2, size_used1, size_used2);
+ XBT_VERB("(%d - %d) Different size used in stacks: %zu - %zu", num1, num2, size_used1, size_used2);
#endif
return 1;
#endif
}
/* Stacks comparison */
- unsigned cursor = 0;
int diff_local = 0;
#ifdef MC_DEBUG
is_diff = 0;
#endif
- mc_snapshot_stack_t stack1, stack2;
- while (cursor < s1->stacks.size()) {
- stack1 = &s1->stacks[cursor];
- stack2 = &s2->stacks[cursor];
+ for (unsigned int cursor = 0; cursor < s1->stacks.size(); cursor++) {
+ mc_snapshot_stack_t stack1 = &s1->stacks[cursor];
+ mc_snapshot_stack_t stack2 = &s2->stacks[cursor];
if (stack1->process_index != stack2->process_index) {
diff_local = 1;
return 1;
#endif
}
- cursor++;
}
size_t regions_count = s1->snapshot_regions.size();
#ifdef MC_VERBOSE
XBT_VERB("(%d - %d) Different heap (mmalloc_compare)", num1, num2);
#endif
-
return 1;
#endif
}