From: Gabriel Corona Date: Mon, 27 Apr 2015 10:38:07 +0000 (+0200) Subject: [mc] Move MCer code from mc_ignore.cpp to mcer_ignore.cpp X-Git-Tag: v3_12~732^2~44 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d22e8aa5fb6c8042de791d6264d02fc8b6f836bd [mc] Move MCer code from mc_ignore.cpp to mcer_ignore.cpp --- diff --git a/src/mc/mc_global.cpp b/src/mc/mc_global.cpp index d6e4ca154a..ae886a48d8 100644 --- a/src/mc/mc_global.cpp +++ b/src/mc/mc_global.cpp @@ -39,6 +39,7 @@ #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" @@ -166,24 +167,24 @@ void MC_init_pid(pid_t pid, int socket) MC_ignore_local_variable("start_time", "*"); /* Main MC state: */ - MC_ignore_global_variable("mc_model_checker"); - MC_ignore_global_variable("initial_communications_pattern"); - MC_ignore_global_variable("incomplete_communications_pattern"); - MC_ignore_global_variable("nb_comm_pattern"); + MCer_ignore_global_variable("mc_model_checker"); + MCer_ignore_global_variable("initial_communications_pattern"); + MCer_ignore_global_variable("incomplete_communications_pattern"); + MCer_ignore_global_variable("nb_comm_pattern"); /* MC __thread variables: */ - MC_ignore_global_variable("mc_diff_info"); - MC_ignore_global_variable("mc_comp_times"); - MC_ignore_global_variable("mc_snapshot_comparison_time"); + MCer_ignore_global_variable("mc_diff_info"); + MCer_ignore_global_variable("mc_comp_times"); + MCer_ignore_global_variable("mc_snapshot_comparison_time"); /* This MC state is used in MC replay as well: */ - MC_ignore_global_variable("mc_time"); + MCer_ignore_global_variable("mc_time"); /* Static variable used for tracing */ - MC_ignore_global_variable("counter"); + MCer_ignore_global_variable("counter"); /* SIMIX */ - MC_ignore_global_variable("smx_total_comms"); + MCer_ignore_global_variable("smx_total_comms"); if (mc_mode == MC_MODE_CLIENT) { /* Those requests are handled on the client side and propagated by message diff --git a/src/mc/mc_ignore.cpp b/src/mc/mc_ignore.cpp index 5440faf703..29bd63f225 100644 --- a/src/mc/mc_ignore.cpp +++ b/src/mc/mc_ignore.cpp @@ -47,16 +47,6 @@ static void stack_ignore_variable_free_voidp(void *v) stack_ignore_variable_free((mc_stack_ignore_variable_t) * (void **) v); } -void heap_ignore_region_free(mc_heap_ignore_region_t r) -{ - xbt_free(r); -} - -void heap_ignore_region_free_voidp(void *r) -{ - heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r); -} - static void checkpoint_ignore_region_free(mc_checkpoint_ignore_region_t r) { xbt_free(r); @@ -118,131 +108,10 @@ void MC_remove_ignore_heap(void *address, size_t size) MC_client_send_message(&message, sizeof(message)); } -// ***** Model-checker: - void MC_ignore_global_variable(const char *name) { - mc_process_t process = &mc_model_checker->process(); - xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap); - xbt_assert(process->object_infos, "MC subsystem not initialized"); - - size_t n = process->object_infos_size; - for (size_t i=0; i!=n; ++i) { - mc_object_info_t info = process->object_infos[i]; - - // Binary search: - int start = 0; - int end = xbt_dynar_length(info->global_variables) - 1; - while (start <= end) { - unsigned int cursor = (start + end) / 2; - dw_variable_t current_var = - (dw_variable_t) xbt_dynar_get_as(info->global_variables, - cursor, dw_variable_t); - if (strcmp(current_var->name, name) == 0) { - xbt_dynar_remove_at(info->global_variables, cursor, NULL); - start = 0; - end = xbt_dynar_length(info->global_variables) - 1; - } else if (strcmp(current_var->name, name) < 0) { - start = cursor + 1; - } else { - end = cursor - 1; - } - } - } - mmalloc_set_current_heap(heap); -} - -/** \brief Ignore a local variable in a scope - * - * Ignore all instances of variables with a given name in - * any (possibly inlined) subprogram with a given namespaced - * name. - * - * \param var_name Name of the local variable (or parameter to ignore) - * \param subprogram_name Name of the subprogram fo ignore (NULL for any) - * \param subprogram (possibly inlined) Subprogram of the scope - * \param scope Current scope - */ -static void mc_ignore_local_variable_in_scope(const char *var_name, - const char *subprogram_name, - dw_frame_t subprogram, - dw_frame_t scope) -{ - // Processing of direct variables: - - // If the current subprogram matches the given name: - if (!subprogram_name || - (subprogram->name && strcmp(subprogram_name, subprogram->name) == 0)) { - - // Try to find the variable and remove it: - int start = 0; - int end = xbt_dynar_length(scope->variables) - 1; - - // Dichotomic search: - while (start <= end) { - int cursor = (start + end) / 2; - dw_variable_t current_var = - (dw_variable_t) xbt_dynar_get_as(scope->variables, cursor, - dw_variable_t); - - int compare = strcmp(current_var->name, var_name); - if (compare == 0) { - // Variable found, remove it: - xbt_dynar_remove_at(scope->variables, cursor, NULL); - - // and start again: - start = 0; - end = xbt_dynar_length(scope->variables) - 1; - } else if (compare < 0) { - start = cursor + 1; - } else { - end = cursor - 1; - } - } - - } - // And recursive processing in nested scopes: - unsigned cursor = 0; - dw_frame_t nested_scope = NULL; - xbt_dynar_foreach(scope->scopes, cursor, nested_scope) { - // The new scope may be an inlined subroutine, in this case we want to use its - // namespaced name in recursive calls: - dw_frame_t nested_subprogram = - nested_scope->tag == - DW_TAG_inlined_subroutine ? nested_scope : subprogram; - - mc_ignore_local_variable_in_scope(var_name, subprogram_name, - nested_subprogram, nested_scope); - } -} - -static void MC_ignore_local_variable_in_object(const char *var_name, - const char *subprogram_name, - mc_object_info_t info) -{ - xbt_dict_cursor_t cursor2; - dw_frame_t frame; - char *key; - xbt_dict_foreach(info->subprograms, cursor2, key, frame) { - mc_ignore_local_variable_in_scope(var_name, subprogram_name, frame, frame); - } -} - -// MCer -void MC_ignore_local_variable(const char *var_name, const char *frame_name) -{ - mc_process_t process = &mc_model_checker->process(); - if (strcmp(frame_name, "*") == 0) - frame_name = NULL; - xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap); - - size_t n = process->object_infos_size; - size_t i; - for (i=0; i!=n; ++i) { - MC_ignore_local_variable_in_object(var_name, frame_name, process->object_infos[i]); - } - - mmalloc_set_current_heap(heap); + // TODO, send a message to the model_checker + xbt_die("Unimplemented"); } void MC_stack_area_add(stack_region_t stack_area) diff --git a/src/mc/mcer_ignore.cpp b/src/mc/mcer_ignore.cpp index d813e7364b..08cb7b098b 100644 --- a/src/mc/mcer_ignore.cpp +++ b/src/mc/mcer_ignore.cpp @@ -18,8 +18,21 @@ extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mcer_ignore, mc, "Logging specific to MC ignore mechanism"); +// ***** Ignore heap chunks + extern xbt_dynar_t mc_heap_comparison_ignore; +void heap_ignore_region_free(mc_heap_ignore_region_t r) +{ + xbt_free(r); +} + +void heap_ignore_region_free_voidp(void *r) +{ + heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r); +} + + void MC_heap_region_ignore_insert(mc_heap_ignore_region_t region) { if (mc_heap_comparison_ignore == NULL) { @@ -94,4 +107,140 @@ void MC_heap_region_ignore_remove(void *address, size_t size) } } +// ***** Ignore global variables + +void MCer_ignore_global_variable(const char *name) +{ + mc_process_t process = &mc_model_checker->process(); + xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap); + xbt_assert(process->object_infos, "MC subsystem not initialized"); + + size_t n = process->object_infos_size; + for (size_t i=0; i!=n; ++i) { + mc_object_info_t info = process->object_infos[i]; + + // Binary search: + int start = 0; + int end = xbt_dynar_length(info->global_variables) - 1; + while (start <= end) { + unsigned int cursor = (start + end) / 2; + dw_variable_t current_var = + (dw_variable_t) xbt_dynar_get_as(info->global_variables, + cursor, dw_variable_t); + if (strcmp(current_var->name, name) == 0) { + xbt_dynar_remove_at(info->global_variables, cursor, NULL); + start = 0; + end = xbt_dynar_length(info->global_variables) - 1; + } else if (strcmp(current_var->name, name) < 0) { + start = cursor + 1; + } else { + end = cursor - 1; + } + } + } + mmalloc_set_current_heap(heap); +} + +// ***** Ignore local variables + +static void mc_ignore_local_variable_in_scope(const char *var_name, + const char *subprogram_name, + dw_frame_t subprogram, + dw_frame_t scope); +static void MC_ignore_local_variable_in_object(const char *var_name, + const char *subprogram_name, + mc_object_info_t info); + +void MC_ignore_local_variable(const char *var_name, const char *frame_name) +{ + mc_process_t process = &mc_model_checker->process(); + if (strcmp(frame_name, "*") == 0) + frame_name = NULL; + xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap); + + size_t n = process->object_infos_size; + size_t i; + for (i=0; i!=n; ++i) { + MC_ignore_local_variable_in_object(var_name, frame_name, process->object_infos[i]); + } + + mmalloc_set_current_heap(heap); +} + +static void MC_ignore_local_variable_in_object(const char *var_name, + const char *subprogram_name, + mc_object_info_t info) +{ + xbt_dict_cursor_t cursor2; + dw_frame_t frame; + char *key; + xbt_dict_foreach(info->subprograms, cursor2, key, frame) { + mc_ignore_local_variable_in_scope(var_name, subprogram_name, frame, frame); + } +} + +/** \brief Ignore a local variable in a scope + * + * Ignore all instances of variables with a given name in + * any (possibly inlined) subprogram with a given namespaced + * name. + * + * \param var_name Name of the local variable (or parameter to ignore) + * \param subprogram_name Name of the subprogram fo ignore (NULL for any) + * \param subprogram (possibly inlined) Subprogram of the scope + * \param scope Current scope + */ +static void mc_ignore_local_variable_in_scope(const char *var_name, + const char *subprogram_name, + dw_frame_t subprogram, + dw_frame_t scope) +{ + // Processing of direct variables: + + // If the current subprogram matches the given name: + if (!subprogram_name || + (subprogram->name && strcmp(subprogram_name, subprogram->name) == 0)) { + + // Try to find the variable and remove it: + int start = 0; + int end = xbt_dynar_length(scope->variables) - 1; + + // Dichotomic search: + while (start <= end) { + int cursor = (start + end) / 2; + dw_variable_t current_var = + (dw_variable_t) xbt_dynar_get_as(scope->variables, cursor, + dw_variable_t); + + int compare = strcmp(current_var->name, var_name); + if (compare == 0) { + // Variable found, remove it: + xbt_dynar_remove_at(scope->variables, cursor, NULL); + + // and start again: + start = 0; + end = xbt_dynar_length(scope->variables) - 1; + } else if (compare < 0) { + start = cursor + 1; + } else { + end = cursor - 1; + } + } + + } + // And recursive processing in nested scopes: + unsigned cursor = 0; + dw_frame_t nested_scope = NULL; + xbt_dynar_foreach(scope->scopes, cursor, nested_scope) { + // The new scope may be an inlined subroutine, in this case we want to use its + // namespaced name in recursive calls: + dw_frame_t nested_subprogram = + nested_scope->tag == + DW_TAG_inlined_subroutine ? nested_scope : subprogram; + + mc_ignore_local_variable_in_scope(var_name, subprogram_name, + nested_subprogram, nested_scope); + } +} + } diff --git a/src/mc/mcer_ignore.h b/src/mc/mcer_ignore.h index 9329362555..d8d3f3f80a 100644 --- a/src/mc/mcer_ignore.h +++ b/src/mc/mcer_ignore.h @@ -12,6 +12,7 @@ SG_BEGIN_DECL(); +void MCer_ignore_global_variable(const char *var_name); void MC_heap_region_ignore_insert(mc_heap_ignore_region_t region); void MC_heap_region_ignore_remove(void *address, size_t size);