/******************************* Transitions **********************************/
typedef struct s_mc_transition *mc_transition_t;
+typedef struct s_mc_ignore_region{
+ void *address;
+ size_t size;
+}s_mc_ignore_region_t, *mc_ignore_region_t;
+
SG_END_DECL()
#endif /* _MC_MC_H */
XBT_PUBLIC(double) MC_process_clock_get(smx_process_t);
void MC_automaton_load(const char *file);
+void MC_ignore_init(void);
+XBT_PUBLIC(void) MC_ignore(void *address, size_t size);
+
/********************************* Memory *************************************/
XBT_PUBLIC(void) MC_memory_init(void); /* Initialize the memory subsystem */
XBT_PUBLIC(void) MC_memory_exit(void);
xbt_fifo_t mc_stack_liveness = NULL;
mc_snapshot_t initial_snapshot_liveness = NULL;
int compare;
+extern xbt_dynar_t mmalloc_ignore;
xbt_automaton_t _mc_property_automaton = NULL;
mc_time = xbt_new0(double, simix_process_maxpid);
+ /* mc_time refers to clock for each process -> ignore it for heap comparison */
+ int i;
+ for(i = 0; i<simix_process_maxpid; i++)
+ MC_ignore(&(mc_time[i]), sizeof(double));
+
compare = 0;
/* Initialize the data structures that must be persistent across every
MC_UNSET_RAW_MEM;
}
+
+void MC_ignore_init(){
+ MC_SET_RAW_MEM;
+ mmalloc_ignore = xbt_dynar_new(sizeof(mc_ignore_region_t), NULL);
+ MC_UNSET_RAW_MEM;
+}
+
+void MC_ignore(void *address, size_t size){
+ MC_SET_RAW_MEM;
+ mc_ignore_region_t region = NULL;
+ region = xbt_new0(s_mc_ignore_region_t, 1);
+ region->address = address;
+ region->size = size;
+ xbt_dynar_push(mmalloc_ignore, ®ion);
+ MC_UNSET_RAW_MEM;
+}
msg_global->process_data_cleanup = NULL;
msg_global->vms = xbt_swag_new(xbt_swag_offset(vm,all_vms_hookup));
+ if(MC_IS_ENABLED){
+ /* Create list of elements to ignore for heap comparison algorithm */
+ MC_ignore_init();
+ /* Ignore total amount of messages sent during the simulation for heap comparison */
+ MC_ignore(&(msg_global->sent_msg), sizeof(msg_global->sent_msg));
+
+ }
+
/* initialization of the action module */
_MSG_action_init();
fflush(stdout);
fflush(stderr);
- if (MC_IS_ENABLED) {
+ if (MC_IS_ENABLED) {
MC_do_the_modelcheck_for_real();
} else {
SIMIX_run();
extern char *xbt_binary_name;
+xbt_dynar_t mmalloc_ignore;
+
typedef struct s_heap_area_pair{
int block1;
int fragment1;
static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous);
static void match_equals(xbt_dynar_t list);
+static size_t heap_comparison_ignore(void *address);
+
void mmalloc_backtrace_block_display(void* heapinfo, int block){
xbt_ex_t e;
}
+static size_t heap_comparison_ignore(void *address){
+ unsigned int cursor = 0;
+ mc_ignore_region_t region;
+ xbt_dynar_foreach(mmalloc_ignore, cursor, region){
+ if(region->address == address)
+ return region->size;
+ }
+ return 0;
+}
+
static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous){
- size_t i = 0, pointer_align = 0;
+ size_t i = 0, pointer_align = 0, ignore1 = 0, ignore2 = 0;
void *address_pointed1, *address_pointed2, *addr_block_pointed1, *addr_block_pointed2, *addr_frag_pointed1, *addr_frag_pointed2;
size_t block_pointed1, block_pointed2, frag_pointed1, frag_pointed2;
size_t frag_size;
int res_compare;
-
+ void *current_area1, *current_area2;
+
while(i<size){
+ current_area1 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area1) + i) - (char *)heapbase1);
+ if((ignore1 = heap_comparison_ignore(current_area1)) > 0){
+ current_area2 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area2) + i) - (char *)heapbase2);
+ if((ignore2 = heap_comparison_ignore(current_area2)) == ignore1){
+ i = i + ignore2;
+ continue;
+ }
+ }
+
if(memcmp(((char *)area1) + i, ((char *)area2) + i, 1) != 0){
/* Check pointer difference */