X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/32dda1d6e208496b7ce85e5f5b677fb295e82277..89a8ddc975b0e3ecd348d5a9a9b9d3de8b579b2b:/src/mc/Client.cpp?ds=sidebyside diff --git a/src/mc/Client.cpp b/src/mc/Client.cpp index a36075f6b6..c05696f5d1 100644 --- a/src/mc/Client.cpp +++ b/src/mc/Client.cpp @@ -14,13 +14,16 @@ #include #include #include +#include + +#include "src/internal_config.h" #include "src/mc/mc_protocol.h" #include "src/mc/Client.hpp" +#include "src/mc/mc_request.h" // We won't need those once the separation MCer/MCed is complete: #include "src/mc/mc_ignore.h" -#include "src/mc/mc_private.h" // MC_deadlock_check() #include "src/mc/mc_smx.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_client, mc, "MC client logic"); @@ -65,7 +68,7 @@ Client* Client::initialize() client_ = std::unique_ptr(new simgrid::mc::Client(fd)); // Wait for the model-checker: - if (ptrace(PTRACE_TRACEME, 0, nullptr, NULL) == -1 || raise(SIGSTOP) != 0) + if (ptrace(PTRACE_TRACEME, 0, nullptr, nullptr) == -1 || raise(SIGSTOP) != 0) xbt_die("Could not wait for the model-checker"); client_->handleMessages(); @@ -91,10 +94,22 @@ void Client::handleMessages() case MC_MESSAGE_DEADLOCK_CHECK: { - int result = MC_deadlock_check(); + // Check deadlock: + bool deadlock = false; + smx_process_t process; + if (xbt_swag_size(simix_global->process_list)) { + deadlock = true; + xbt_swag_foreach(process, simix_global->process_list) + if (simgrid::mc::process_is_enabled(process)) { + deadlock = false; + break; + } + } + + // Send result: s_mc_int_message_t answer; answer.type = MC_MESSAGE_DEADLOCK_CHECK_REPLY; - answer.value = result; + answer.value = deadlock; if (channel_.send(answer)) xbt_die("Could not send response"); } @@ -141,12 +156,103 @@ void Client::handleMessages() void Client::mainLoop(void) { while (1) { + simgrid::mc::wait_for_requests(); if (channel_.send(MC_MESSAGE_WAITING)) xbt_die("Could not send WAITING mesage to model-checker"); this->handleMessages(); - simgrid::mc::wait_for_requests(); } } +void Client::reportAssertionFailure(const char* description) +{ + if (channel_.send(MC_MESSAGE_ASSERTION_FAILED)) + xbt_die("Could not send assertion to model-checker"); + this->handleMessages(); +} + +void Client::ignoreMemory(void* addr, std::size_t size) +{ + s_mc_ignore_memory_message_t message; + message.type = MC_MESSAGE_IGNORE_MEMORY; + message.addr = (std::uintptr_t) addr; + message.size = size; + if (channel_.send(message)) + xbt_die("Could not send IGNORE_MEMORY mesage to model-checker"); +} + +void Client::ignoreHeap(void* address, std::size_t size) +{ + xbt_mheap_t heap = mmalloc_get_current_heap(); + + 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[message.block].type == 0) { + message.fragment = -1; + heap->heapinfo[message.block].busy_block.ignore++; + } else { + message.fragment = + ((uintptr_t) (ADDR2UINT(address) % (BLOCKSIZE))) >> + heap->heapinfo[message.block].type; + heap->heapinfo[message.block].busy_frag.ignore[message.fragment]++; + } + + if (channel_.send(message)) + xbt_die("Could not send ignored region to MCer"); +} + +void Client::unignoreHeap(void* address, std::size_t size) +{ + s_mc_ignore_memory_message_t message; + message.type = MC_MESSAGE_UNIGNORE_HEAP; + message.addr = (std::uintptr_t) address; + message.size = size; + if (channel_.send(message)) + xbt_die("Could not send IGNORE_HEAP mesasge to model-checker"); +} + +void Client::declareSymbol(const char *name, int* value) +{ + s_mc_register_symbol_message_t message; + message.type = MC_MESSAGE_REGISTER_SYMBOL; + if (strlen(name) + 1 > sizeof(message.name)) + xbt_die("Symbol is too long"); + strncpy(message.name, name, sizeof(message.name)); + message.callback = nullptr; + message.data = value; + if (channel_.send(message)) + xbt_die("Could send REGISTER_SYMBOL message to model-checker"); +} + +void Client::declareStack(void *stack, size_t size, smx_process_t process, ucontext_t* context) +{ + xbt_mheap_t heap = mmalloc_get_current_heap(); + + s_stack_region_t region; + memset(®ion, 0, sizeof(region)); + region.address = stack; + region.context = context; + region.size = size; + region.block = + ((char *) stack - + (char *) heap->heapbase) / BLOCKSIZE + 1; +#if HAVE_SMPI + if (smpi_privatize_global_variables && process) + region.process_index = smpi_process_index_of_smx_process(process); + else +#endif + region.process_index = -1; + + s_mc_stack_region_message_t message; + message.type = MC_MESSAGE_STACK_REGION; + message.stack_region = region; + if (channel_.send(message)) + xbt_die("Coule not send STACK_REGION to model-checker"); +} + } }