X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3c5b31c9766da42c82473b8c9dbf5910b74f3cb0..7f0845ec805dc9b93cab3adb223eadd20aa1f169:/src/mc/mc_process.c diff --git a/src/mc/mc_process.c b/src/mc/mc_process.c index fd3942043b..7e047abad8 100644 --- a/src/mc/mc_process.c +++ b/src/mc/mc_process.c @@ -17,10 +17,15 @@ #include #include +#include + #include "mc_process.h" #include "mc_object_info.h" #include "mc_address_space.h" #include "mc_unw.h" +#include "mc_snapshot.h" +#include "mc_ignore.h" +#include "mc_smx.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_process, mc, "MC process information"); @@ -28,6 +33,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_process, mc, static void MC_process_init_memory_map_info(mc_process_t process); static void MC_process_open_memory_file(mc_process_t process); +// ***** Destructor callbacks + +// ***** mc_address_space methods for mc_process + static mc_process_t MC_process_get_process(mc_process_t p) { return p; } @@ -42,6 +51,8 @@ bool MC_is_process(mc_address_space_t p) return p->address_space_class == &mc_process_class; } +// ***** mc_process + void MC_process_init(mc_process_t process, pid_t pid, int sockfd) { process->address_space.address_space_class = &mc_process_class; @@ -70,6 +81,11 @@ void MC_process_init(mc_process_t process, pid_t pid, int sockfd) &process->heap_address, std_heap_var->address, sizeof(struct mdesc*), MC_PROCESS_INDEX_DISABLED); + process->smx_process_infos = MC_smx_process_info_list_new(); + process->smx_old_process_infos = MC_smx_process_info_list_new(); + + process->checkpoint_ignore = MC_checkpoint_ignore_new(); + process->unw_addr_space = unw_create_addr_space(&mc_unw_accessors , __BYTE_ORDER); if (process->process_flags & MC_PROCESS_SELF_FLAG) { process->unw_underlying_addr_space = unw_local_addr_space; @@ -92,6 +108,11 @@ void MC_process_clear(mc_process_t process) process->maestro_stack_start = NULL; process->maestro_stack_end = NULL; + xbt_dynar_free(&process->checkpoint_ignore); + + xbt_dynar_free(&process->smx_process_infos); + xbt_dynar_free(&process->smx_old_process_infos); + size_t i; for (i=0; i!=process->object_infos_size; ++i) { MC_free_object_info(&process->object_infos[i]); @@ -127,8 +148,7 @@ void MC_process_refresh_heap(mc_process_t process) assert(!MC_process_is_self(process)); // Read/dereference/refresh the std_heap pointer: if (!process->heap) { - xbt_mheap_t oldheap = mmalloc_get_current_heap(); - MC_SET_MC_HEAP; + xbt_mheap_t oldheap = mmalloc_set_current_heap(mc_heap); process->heap = malloc(sizeof(struct mdesc)); mmalloc_set_current_heap(oldheap); } @@ -146,11 +166,10 @@ void MC_process_refresh_malloc_info(mc_process_t process) // Refresh process->heapinfo: size_t malloc_info_bytesize = process->heap->heaplimit * sizeof(malloc_info); - xbt_mheap_t oldheap = mmalloc_get_current_heap(); - MC_SET_MC_HEAP; + xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap); process->heap_info = (malloc_info*) realloc(process->heap_info, malloc_info_bytesize); - mmalloc_set_current_heap(oldheap); + mmalloc_set_current_heap(heap); MC_process_read(process, MC_ADDRESS_SPACE_READ_FLAGS_NONE, process->heap_info, @@ -359,15 +378,37 @@ dw_variable_t MC_process_find_variable_by_name(mc_process_t process, const char* { const size_t n = process->object_infos_size; size_t i; + + // First lookup the variable in the executable shared object. + // A global variable used directly by the executable code from a library + // is reinstanciated in the executable memory .data/.bss. + // We need to look up the variable in the execvutable first. + if (process->binary_info) { + mc_object_info_t info = process->binary_info; + dw_variable_t var = MC_file_object_info_find_variable_by_name(info, name); + if (var) + return var; + } + for (i=0; i!=n; ++i) { mc_object_info_t info =process->object_infos[i]; dw_variable_t var = MC_file_object_info_find_variable_by_name(info, name); if (var) return var; } + return NULL; } +void MC_process_read_variable(mc_process_t process, const char* name, void* target, size_t size) +{ + dw_variable_t var = MC_process_find_variable_by_name(process, name); + if (!var->address) + xbt_die("No simple location for this variable"); + MC_process_read(process, MC_PROCESS_NO_FLAG, target, var->address, size, + MC_PROCESS_INDEX_ANY); +} + // ***** Memory access int MC_process_vm_open(pid_t pid, int flags) @@ -461,6 +502,24 @@ const void* MC_process_read(mc_process_t process, e_adress_space_read_flags_t fl } } +const void* MC_process_read_simple(mc_process_t process, + void* local, const void* remote, size_t len) +{ + e_adress_space_read_flags_t flags = MC_PROCESS_NO_FLAG; + int index = MC_PROCESS_INDEX_ANY; + MC_process_read(process, flags, local, remote, len, index); + return local; +} + +const void* MC_process_read_dynar_element(mc_process_t process, + void* local, const void* remote_dynar, size_t i) +{ + s_xbt_dynar_t d; + MC_process_read_simple(process, &d, remote_dynar, sizeof(d)); + MC_process_read_simple(process, local, xbt_dynar_get_ptr(&d, i), i); + return local; +} + void MC_process_write(mc_process_t process, const void* local, void* remote, size_t len) { if (MC_process_is_self(process)) { @@ -500,3 +559,35 @@ void MC_process_clear_memory(mc_process_t process, void* remote, size_t len) } } } + +void MC_simcall_handle(smx_simcall_t req, int value) +{ + if (MC_process_is_self(&mc_model_checker->process)) { + SIMIX_simcall_handle(req, value); + return; + } + + MC_process_smx_refresh(&mc_model_checker->process); + + unsigned i; + mc_smx_process_info_t pi = NULL; + + xbt_dynar_foreach_ptr(mc_model_checker->process.smx_process_infos, i, pi) { + smx_process_t p = (smx_process_t) pi->address; + if (req == &pi->copy.simcall) { + smx_simcall_t real_req = &p->simcall; + // TODO, use a remote call + SIMIX_simcall_handle(real_req, value); + return; + } + } + + // Check (remove afterwards): + xbt_dynar_foreach_ptr(mc_model_checker->process.smx_process_infos, i, pi) { + smx_process_t p = (smx_process_t) pi->address; + if (req == &p->simcall) + xbt_die("The real simcall was passed. We expected the local copy."); + } + + xbt_die("Could not find the request"); +}