From: Gabriel Corona Date: Fri, 20 Nov 2015 12:52:24 +0000 (+0100) Subject: [mc] Move heap_ignore to Process X-Git-Tag: v3_13~1566 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/2f531aa69f09fed380e2e212df5822874aab5e58?hp=df00205b8db0067640f48bdb63426689aa80360f [mc] Move heap_ignore to Process --- diff --git a/src/include/mc/datatypes.h b/src/include/mc/datatypes.h index c33ed9b46f..763b60dee6 100644 --- a/src/include/mc/datatypes.h +++ b/src/include/mc/datatypes.h @@ -24,13 +24,6 @@ typedef struct s_mc_transition *mc_transition_t; /*********** Structures for snapshot comparison **************************/ -typedef struct s_mc_heap_ignore_region{ - int block; - int fragment; - void *address; - size_t size; -}s_mc_heap_ignore_region_t, *mc_heap_ignore_region_t; - typedef struct s_stack_region{ void *address; void *context; diff --git a/src/include/mc/mc.h b/src/include/mc/mc.h index 7fb1dbafc7..f227baef43 100644 --- a/src/include/mc/mc.h +++ b/src/include/mc/mc.h @@ -57,8 +57,6 @@ extern XBT_PRIVATE int _sg_mc_liveness; extern XBT_PRIVATE int _sg_mc_snapshot_fds; extern XBT_PRIVATE int _sg_mc_termination; -extern XBT_PRIVATE xbt_dynar_t mc_heap_comparison_ignore; - /********************************* Global *************************************/ XBT_PRIVATE void _mc_cfg_cb_reduce(const char *name, int pos); @@ -77,8 +75,6 @@ XBT_PRIVATE void _mc_cfg_cb_comms_determinism(const char *name, int pos); XBT_PRIVATE void _mc_cfg_cb_send_determinism(const char *name, int pos); XBT_PRIVATE void _mc_cfg_cb_termination(const char *name, int pos); -extern xbt_dynar_t mc_heap_comparison_ignore; - XBT_PUBLIC(void) MC_run(void); XBT_PUBLIC(void) MC_init(void); XBT_PUBLIC(void) MC_exit(void); diff --git a/src/mc/ModelChecker.cpp b/src/mc/ModelChecker.cpp index ac7f0fd7b2..92be55851a 100644 --- a/src/mc/ModelChecker.cpp +++ b/src/mc/ModelChecker.cpp @@ -28,7 +28,6 @@ #include "mc_protocol.h" #include "mc_private.h" #include "mc_ignore.h" -#include "mcer_ignore.h" #include "mc_exit.h" #include "src/mc/mc_liveness.h" @@ -203,9 +202,13 @@ bool ModelChecker::handle_message(char* buffer, ssize_t size) if (size != sizeof(message)) xbt_die("Broken messsage"); memcpy(&message, buffer, sizeof(message)); - mc_heap_ignore_region_t region = xbt_new(s_mc_heap_ignore_region_t, 1); - *region = message.region; - MC_heap_region_ignore_insert(region); + + IgnoredHeapRegion region; + region.block = message.block; + region.fragment = message.fragment; + region.address = message.address; + region.size = message.size; + process().ignore_heap(region); break; } @@ -215,7 +218,7 @@ bool ModelChecker::handle_message(char* buffer, ssize_t size) if (size != sizeof(message)) xbt_die("Broken messsage"); memcpy(&message, buffer, sizeof(message)); - MC_heap_region_ignore_remove( + process().unignore_heap( (void *)(std::uintptr_t) message.addr, message.size); break; } diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index 2a883bd76d..665e29e71e 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -636,5 +636,67 @@ void Process::read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_cou xbt_die("Could not read pagemap"); } +void Process::ignore_heap(IgnoredHeapRegion const& region) +{ + if (ignored_heap_.empty()) { + ignored_heap_.push_back(std::move(region)); + return; + } + + typedef std::vector::size_type size_type; + + size_type start = 0; + size_type end = ignored_heap_.size() - 1; + + // Binary search the position of insertion: + size_type cursor; + while (start <= end) { + cursor = start + (end - start) / 2; + auto& current_region = ignored_heap_[cursor]; + if (current_region.address == region.address) + return; + else if (current_region.address < region.address) + start = cursor + 1; + else if (cursor != 0) + end = cursor - 1; + // Avoid underflow: + else + break; + } + + // Insert it mc_heap_ignore_region_t: + if (ignored_heap_[cursor].address < region.address) + ++cursor; + ignored_heap_.insert( ignored_heap_.begin() + cursor, region); +} + +void Process::unignore_heap(void *address, size_t size) +{ + typedef std::vector::size_type size_type; + + size_type start = 0; + size_type end = ignored_heap_.size() - 1; + + // Binary search: + size_type cursor; + while (start <= end) { + cursor = (start + end) / 2; + auto& region = ignored_heap_[cursor]; + if (region.address == address) { + ignored_heap_.erase(ignored_heap_.begin() + cursor); + return; + } else if (region.address < address) + start = cursor + 1; + else if ((char *) region.address <= ((char *) address + size)) { + ignored_heap_.erase(ignored_heap_.begin() + cursor); + return; + } else if (cursor != 0) + end = cursor - 1; + // Avoid underflow: + else + break; + } +} + } } diff --git a/src/mc/Process.hpp b/src/mc/Process.hpp index bb8c478a00..2999813f9d 100644 --- a/src/mc/Process.hpp +++ b/src/mc/Process.hpp @@ -54,6 +54,13 @@ struct IgnoredRegion { size_t size; }; +struct IgnoredHeapRegion { + int block; + int fragment; + void *address; + size_t size; +}; + /** Representation of a process */ class Process final : public AddressSpace { @@ -177,6 +184,13 @@ public: return stack_areas_; } + std::vector const& ignored_heap() const + { + return ignored_heap_; + } + void ignore_heap(IgnoredHeapRegion const& region); + void unignore_heap(void *address, size_t size); + private: void init_memory_map_info(); void refresh_heap(); @@ -193,6 +207,7 @@ private: int pagemap_fd_; bool privatized_; std::vector stack_areas_; + std::vector ignored_heap_; public: // object info // TODO, make private (first, objectify simgrid::mc::ObjectInformation*) diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index 62902b22f6..6bafeae722 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -446,28 +446,6 @@ static std::vector MC_take_snapshot_stacks(mc_snapshot_t } -static std::vector MC_take_snapshot_ignore() -{ - std::vector res; - - if (mc_heap_comparison_ignore == NULL) - return std::move(res); - - unsigned int cursor = 0; - mc_heap_ignore_region_t current_region; - - xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region) { - s_mc_heap_ignore_region_t new_region; - new_region.address = current_region->address; - new_region.size = current_region->size; - new_region.block = current_region->block; - new_region.fragment = current_region->fragment; - res.push_back(std::move(new_region)); - } - - return std::move(res); -} - static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot) { xbt_assert(snapshot->process()); @@ -604,7 +582,7 @@ mc_snapshot_t MC_take_snapshot(int num_state) if (use_soft_dirty) mc_process->reset_soft_dirty(); - snapshot->to_ignore = MC_take_snapshot_ignore(); + snapshot->to_ignore = mc_model_checker->process().ignored_heap(); if (_sg_mc_visited > 0 || strcmp(_sg_mc_property_file, "")) { snapshot->stacks = diff --git a/src/mc/mc_diff.cpp b/src/mc/mc_diff.cpp index 6cf5993e02..f1694c48c1 100644 --- a/src/mc/mc_diff.cpp +++ b/src/mc/mc_diff.cpp @@ -24,8 +24,6 @@ extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_diff, xbt, "Logging specific to mc_diff in mc"); -xbt_dynar_t mc_heap_comparison_ignore; - /*********************************** Heap comparison ***********************************/ /***************************************************************************************/ @@ -36,8 +34,8 @@ struct XBT_PRIVATE s_mc_diff { std::size_t heaplimit; // Number of blocks in the heaps: std::size_t heapsize1, heapsize2; - std::vector* to_ignore1; - std::vector* to_ignore2; + std::vector* to_ignore1; + std::vector* to_ignore2; s_heap_area_t *equals_to1, *equals_to2; simgrid::mc::Type **types1; simgrid::mc::Type **types2; @@ -119,15 +117,16 @@ static int add_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, return 0; } -static ssize_t heap_comparison_ignore_size(std::vector* ignore_list, - const void *address) +static ssize_t heap_comparison_ignore_size( + std::vector* ignore_list, + const void *address) { int start = 0; int end = ignore_list->size() - 1; while (start <= end) { unsigned int cursor = (start + end) / 2; - s_mc_heap_ignore_region_t region = (*ignore_list)[cursor]; + simgrid::mc::IgnoredHeapRegion const& region = (*ignore_list)[cursor]; if (region.address == address) return region.size; if (region.address < address) @@ -225,8 +224,8 @@ static int equal_fragments(struct s_mc_diff *state, int b1, int f1, int b2, } int init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2, - std::vector* i1, - std::vector* i2) + std::vector* i1, + std::vector* i2) { if (mc_diff_info == NULL) { mc_diff_info = xbt_new0(struct s_mc_diff, 1); diff --git a/src/mc/mc_global.cpp b/src/mc/mc_global.cpp index 2c484c1b20..154e5c6971 100644 --- a/src/mc/mc_global.cpp +++ b/src/mc/mc_global.cpp @@ -40,7 +40,6 @@ #include "mc_private.h" #include "mc_unw.h" #include "mc_smx.h" -#include "mcer_ignore.h" #endif #include "mc_record.h" #include "mc_protocol.h" diff --git a/src/mc/mc_ignore.cpp b/src/mc/mc_ignore.cpp index d758c7f99a..debb2a4ac7 100644 --- a/src/mc/mc_ignore.cpp +++ b/src/mc/mc_ignore.cpp @@ -27,26 +27,23 @@ void MC_ignore_heap(void *address, size_t size) xbt_mheap_t heap = mmalloc_get_current_heap(); - s_mc_heap_ignore_region_t region; - memset(®ion, 0, sizeof(region)); - region.address = address; - region.size = size; - region.block = + s_mc_ignore_heap_message_t message; + message.type = MC_MESSAGE_IGNORE_HEAP; + message.address = address; + message.size = size; + message.block = ((char *) address - (char *) heap->heapbase) / BLOCKSIZE + 1; - if (heap->heapinfo[region.block].type == 0) { - region.fragment = -1; - heap->heapinfo[region.block].busy_block.ignore++; + if (heap->heapinfo[message.block].type == 0) { + message.fragment = -1; + heap->heapinfo[message.block].busy_block.ignore++; } else { - region.fragment = + message.fragment = ((uintptr_t) (ADDR2UINT(address) % (BLOCKSIZE))) >> - heap->heapinfo[region.block].type; - heap->heapinfo[region.block].busy_frag.ignore[region.fragment]++; + heap->heapinfo[message.block].type; + heap->heapinfo[message.block].busy_frag.ignore[message.fragment]++; } - s_mc_ignore_heap_message_t message; - message.type = MC_MESSAGE_IGNORE_HEAP; - message.region = region; if (MC_protocol_send(mc_client->fd, &message, sizeof(message))) xbt_die("Could not send ignored region to MCer"); } diff --git a/src/mc/mc_protocol.h b/src/mc/mc_protocol.h index ee0d4334a3..64b0e7021a 100644 --- a/src/mc/mc_protocol.h +++ b/src/mc/mc_protocol.h @@ -77,7 +77,10 @@ typedef struct s_mc_int_message { typedef struct s_mc_ignore_heap_message { e_mc_message_type type; - s_mc_heap_ignore_region_t region; + int block; + int fragment; + void *address; + size_t size; } s_mc_ignore_heap_message_t, *mc_ignore_heap_message_t; typedef struct s_mc_ignore_memory_message { diff --git a/src/mc/mc_snapshot.h b/src/mc/mc_snapshot.h index 11689346d9..165325069d 100644 --- a/src/mc/mc_snapshot.h +++ b/src/mc/mc_snapshot.h @@ -155,7 +155,7 @@ public: // To be private int privatization_index; std::vector stack_sizes; std::vector stacks; - std::vector to_ignore; + std::vector to_ignore; std::uint64_t hash; std::vector ignored_data; std::vector current_fds; @@ -260,7 +260,7 @@ void* MC_region_read_pointer(mc_mem_region_t region, const void* addr) SG_END_DECL() XBT_PRIVATE int init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2, - std::vector* i1, - std::vector* i2); + std::vector* i1, + std::vector* i2); #endif diff --git a/src/mc/mcer_ignore.cpp b/src/mc/mcer_ignore.cpp index 838e5c4f2c..1ef7852a84 100644 --- a/src/mc/mcer_ignore.cpp +++ b/src/mc/mcer_ignore.cpp @@ -24,93 +24,6 @@ extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mcer_ignore, mc, "Logging specific to MC ignore mechanism"); -// ***** Ignore heap chunks - -extern XBT_PRIVATE xbt_dynar_t mc_heap_comparison_ignore; - -static void heap_ignore_region_free(mc_heap_ignore_region_t r) -{ - xbt_free(r); -} - -static void heap_ignore_region_free_voidp(void *r) -{ - heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r); -} - - -XBT_PRIVATE void MC_heap_region_ignore_insert(mc_heap_ignore_region_t region) -{ - if (mc_heap_comparison_ignore == NULL) { - mc_heap_comparison_ignore = - xbt_dynar_new(sizeof(mc_heap_ignore_region_t), - heap_ignore_region_free_voidp); - xbt_dynar_push(mc_heap_comparison_ignore, ®ion); - return; - } - - unsigned int cursor = 0; - mc_heap_ignore_region_t current_region = NULL; - int start = 0; - int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1; - - // Find the position where we want to insert the mc_heap_ignore_region_t: - while (start <= end) { - cursor = (start + end) / 2; - current_region = - (mc_heap_ignore_region_t) xbt_dynar_get_as(mc_heap_comparison_ignore, - cursor, - mc_heap_ignore_region_t); - if (current_region->address == region->address) { - heap_ignore_region_free(region); - return; - } else if (current_region->address < region->address) { - start = cursor + 1; - } else { - end = cursor - 1; - } - } - - // Insert it mc_heap_ignore_region_t: - if (current_region->address < region->address) - xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor + 1, ®ion); - else - xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, ®ion); -} - -XBT_PRIVATE void MC_heap_region_ignore_remove(void *address, size_t size) -{ - unsigned int cursor = 0; - int start = 0; - int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1; - mc_heap_ignore_region_t region; - int ignore_found = 0; - - while (start <= end) { - cursor = (start + end) / 2; - region = - (mc_heap_ignore_region_t) xbt_dynar_get_as(mc_heap_comparison_ignore, - cursor, - mc_heap_ignore_region_t); - if (region->address == address) { - ignore_found = 1; - break; - } else if (region->address < address) { - start = cursor + 1; - } else { - if ((char *) region->address <= ((char *) address + size)) { - ignore_found = 1; - break; - } else { - end = cursor - 1; - } - } - } - - if (ignore_found == 1) { - xbt_dynar_remove_at(mc_heap_comparison_ignore, cursor, NULL); - MC_remove_ignore_heap(address, size); - } } // ***** Ignore local variables @@ -123,6 +36,7 @@ static void MC_ignore_local_variable_in_object(const char *var_name, const char *subprogram_name, simgrid::mc::ObjectInformation* info); +extern "C" void MC_ignore_local_variable(const char *var_name, const char *frame_name) { simgrid::mc::Process* process = &mc_model_checker->process(); @@ -201,6 +115,4 @@ static void mc_ignore_local_variable_in_scope(const char *var_name, mc_ignore_local_variable_in_scope(var_name, subprogram_name, nested_subprogram, &nested_scope); } -} - -} +} \ No newline at end of file diff --git a/src/mc/mcer_ignore.h b/src/mc/mcer_ignore.h deleted file mode 100644 index 1961f4bb24..0000000000 --- a/src/mc/mcer_ignore.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2015. 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. */ - -#ifndef SIMGRID_MCER_IGNORE_H -#define SIMGRID_MCER_IGNORE_H - -#include - -#include "mc/datatypes.h" -#include "src/mc/Process.hpp" - -#include "xbt/misc.h" /* SG_BEGIN_DECL */ - -SG_BEGIN_DECL(); - -XBT_PRIVATE void MC_heap_region_ignore_insert(mc_heap_ignore_region_t region); -XBT_PRIVATE void MC_heap_region_ignore_remove(void *address, size_t size); - -SG_END_DECL(); - -#endif \ No newline at end of file diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index f00067fd42..7e9bd31d89 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -660,7 +660,6 @@ set(MC_SRC src/mc/mc_hash.cpp src/mc/mc_ignore.cpp src/mc/mcer_ignore.cpp - src/mc/mcer_ignore.h src/mc/mc_ignore.h src/mc/mc_liveness.h src/mc/LocationList.hpp