X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a70186f00cc3977370401b4736aac4e43c5fc689..bae076147bfc88ce8607f15761149f42d0443585:/src/mc/mc_hash.cpp?ds=sidebyside diff --git a/src/mc/mc_hash.cpp b/src/mc/mc_hash.cpp index 7709cc7ac0..eac6cc933f 100644 --- a/src/mc/mc_hash.cpp +++ b/src/mc/mc_hash.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2014. The SimGrid Team. +/* Copyright (c) 2014-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -16,14 +16,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_hash, mc, "Logging specific to mc_hash"); +namespace simgrid { +namespace mc { + // This is djb2: -typedef uint64_t mc_hash_t; -#define MC_HASH_INIT ((uint64_t)5381) +#define MC_HASH_INIT ((simgrid::mc::hash_type)5381) -// #define MC_HASH(hash, value) hash = (((hash << 5) + hash) + (uint64_t) value) -#define MC_HASH(hash, value) \ - { hash = (((hash << 5) + hash) + (uint64_t) value);\ - XBT_DEBUG("%s:%i: %" PRIx64 " -> %" PRIx64, __FILE__, __LINE__, (uint64_t) value, hash); } +template +static void hash_update(hash_type& hash, T const& value) +{ + hash = (hash << 5) + hash + (uint64_t) value; +} // ***** Hash state @@ -64,11 +67,11 @@ static bool mc_ignored(const void *address, size_t size) return false; } -static void mc_hash_binary(mc_hash_t * hash, const void *s, size_t len) +static void mc_hash_binary(hash_type * hash, const void *s, size_t len) { const char *p = (const char*) s; for (size_t i = 0; i != len; ++i) { - MC_HASH(*hash, p[i]); + hash_update(*hash, p[i]); } } @@ -79,11 +82,11 @@ static void mc_hash_binary(mc_hash_t * hash, const void *s, size_t len) * \param address address of the variable * \param type type of the variable * */ -static void mc_hash_value(mc_hash_t * hash, mc_hashing_state * state, - mc_object_info_t info, const void *address, - dw_type_t type) +static void mc_hash_value(hash_type * hash, mc_hashing_state * state, + simgrid::mc::ObjectInformation* info, const void *address, + simgrid::mc::Type* type) { - mc_process_t process = &mc_model_checker->process(); + simgrid::mc::Process* process = &mc_model_checker->process(); top: switch (type->type) { @@ -108,7 +111,7 @@ top: return; long element_count = type->element_count; - dw_type_t subtype = type->subtype; + simgrid::mc::Type* subtype = type->subtype; if (subtype == NULL) { XBT_DEBUG("Hash array without subtype"); return; @@ -142,7 +145,7 @@ top: return; unsigned int cursor = 0; - dw_type_t member; + simgrid::mc::Type* member; xbt_dynar_foreach(type->members, cursor, member) { XBT_DEBUG("Hash struct member %s", member->name); if (type->subtype == NULL) @@ -186,7 +189,8 @@ top: } if (type->subtype == NULL) { - XBT_DEBUG("Missing type for %p (type=%s)", pointed, type->dw_type_id); + XBT_DEBUG("Missing type for %p (type=%s)", + pointed, type->type_id.c_str()); return; } @@ -203,20 +207,20 @@ top: } } -static void mc_hash_object_globals(mc_hash_t * hash, mc_hashing_state * state, - mc_object_info_t info) +static void mc_hash_object_globals(hash_type * hash, mc_hashing_state * state, + simgrid::mc::ObjectInformation* info) { unsigned int cursor = 0; - dw_variable_t variable; + simgrid::mc::Variable* variable; xbt_dynar_foreach(info->global_variables, cursor, variable) { XBT_DEBUG("Hash global variable %s", variable->name); - if (variable->type_origin == NULL) { + if (variable->type_id == NULL) { // Nothing continue; } - dw_type_t type = variable->type; + simgrid::mc::Type* type = variable->type; if (type == NULL) { // Nothing continue; @@ -237,18 +241,18 @@ static void mc_hash_object_globals(mc_hash_t * hash, mc_hashing_state * state, } static void mc_hash_stack_frame(mc_hash_t * hash, - mc_object_info_t info, - unw_cursor_t * unw_cursor, dw_frame_t frame, + simgrid::mc::ObjectInformation* info, + unw_cursor_t * unw_cursor, simgrid::mc::Frame* frame, char *frame_pointer, mc_hashing_state * state) { // return; // TEMP unsigned int cursor = 0; - dw_variable_t variable; + simgrid::mc::Variable* variable; xbt_dynar_foreach(frame->variables, cursor, variable) { - if (variable->type_origin == NULL) { + if (variable->type_id == NULL) { XBT_DEBUG("Hash local variable %s without type", variable->name); continue; } @@ -264,7 +268,7 @@ static void mc_hash_stack_frame(mc_hash_t * hash, variable->object_info, unw_cursor, frame_pointer, NULL); - dw_type_t type = variable->type; + simgrid::mc::Type* type = variable->type; if (type == NULL) { XBT_DEBUG("Hash local variable %s without loctypeation", variable->name); continue; @@ -285,9 +289,9 @@ static void mc_hash_stack(mc_hash_t * hash, mc_snapshot_stack_t stack, for(s_mc_stack_frame_t const& stack_frame : stack->stack_frames) { - MC_HASH(*hash, stack_frame.ip); + hash_update(*hash, stack_frame.ip); - mc_object_info_t info; + simgrid::mc::ObjectInformation* info; if (stack_frame.ip >= (unw_word_t) libsimgrid_info->start_exec && stack_frame.ip < (unw_word_t) libsimgrid_info->end_exec) info = libsimgrid_info; @@ -310,7 +314,7 @@ static void mc_hash_stacks(mc_hash_t * hash, mc_hashing_state * state, unsigned int cursor = 0; mc_snapshot_stack_t current_stack; - MC_HASH(*hash, xbt_dynar_length(stacks_areas)); + hash_update(*hash, xbt_dynar_length(stacks_areas)); int i = 0; xbt_dynar_foreach(stacks, cursor, current_stack) { @@ -321,18 +325,16 @@ static void mc_hash_stacks(mc_hash_t * hash, mc_hashing_state * state, } #endif -uint64_t mc_hash_processes_state(int num_state, std::vector const& stacks) +static hash_type hash(std::vector const& stacks) { - XBT_DEBUG("START hash %i", num_state); - #if 0 mc_hashing_state state; mc_hash_state_init(&state); #endif - mc_hash_t hash = MC_HASH_INIT; + hash_type hash = MC_HASH_INIT; - MC_HASH(hash, xbt_swag_size(simix_global->process_list)); // process count + hash_update(hash, xbt_swag_size(simix_global->process_list)); #if 0 // mc_hash_object_globals(&hash, &state, binary_info); // mc_hash_object_globals(&hash, &state, libsimgrid_info); @@ -340,6 +342,17 @@ uint64_t mc_hash_processes_state(int num_state, std::vector