X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d13b1659a0c2551ee41b287a269e391bb2d7bc8a..603c44e45e00a577bccb42cf398a924178f17768:/src/mc/mc_client.cpp diff --git a/src/mc/mc_client.cpp b/src/mc/mc_client.cpp index 6109240b25..a173b8f884 100644 --- a/src/mc/mc_client.cpp +++ b/src/mc/mc_client.cpp @@ -4,44 +4,49 @@ /* 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. */ -#include -#include -#include +#include +#include #include +#include #include #include #include #include -#include "mc_protocol.h" -#include "mc_client.h" +#include "src/mc/mc_protocol.h" +#include "src/mc/mc_client.h" // We won't need those once the separation MCer/MCed is complete: -#include "mc_mmalloc.h" -#include "mc_ignore.h" -#include "mc_private.h" // MC_deadlock_check() -#include "mc_smx.h" - -extern "C" { +#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"); +extern "C" { + mc_client_t mc_client; void MC_client_init(void) { + if (mc_mode != MC_MODE_NONE) + return; + if (!getenv(MC_ENV_SOCKET_FD)) + return; + mc_mode = MC_MODE_CLIENT; + if (mc_client) { XBT_WARN("MC_client_init called more than once."); return; } - char* fd_env = getenv(MC_ENV_SOCKET_FD); + char* fd_env = std::getenv(MC_ENV_SOCKET_FD); if (!fd_env) xbt_die("MC socket not found"); - int fd = atoi(fd_env); + int fd = xbt_str_parse_int(fd_env,bprintf("Variable %s should contain a number but contains '%%s'", MC_ENV_SOCKET_FD)); XBT_DEBUG("Model-checked application found socket FD %i", fd); int type; @@ -55,12 +60,11 @@ void MC_client_init(void) mc_client = xbt_new0(s_mc_client_t, 1); mc_client->fd = fd; mc_client->active = 1; -} -void MC_client_hello(void) -{ - if (MC_protocol_hello(mc_client->fd) != 0) - xbt_die("Could not say hello the MC server"); + // Waiting for the model-checker: + if (ptrace(PTRACE_TRACEME, 0, nullptr, NULL) == -1 || raise(SIGSTOP) != 0) + xbt_die("Could not wait for the model-checker"); + MC_client_handle_messages(); } void MC_client_send_message(void* message, size_t size) @@ -119,6 +123,16 @@ void MC_client_handle_messages(void) } break; + case MC_MESSAGE_RESTORE: + { + s_mc_restore_message_t message; + if (s != sizeof(message)) + xbt_die("Unexpected size for SIMCALL_HANDLE"); + memcpy(&message, message_buffer, sizeof(message)); + smpi_really_switch_data_segment(message.index); + } + break; + default: xbt_die("%s received unexpected message %s (%i)", MC_mode_name(mc_mode), @@ -134,7 +148,7 @@ void MC_client_main_loop(void) while (1) { MC_protocol_send_simple_message(mc_client->fd, MC_MESSAGE_WAITING); MC_client_handle_messages(); - MC_wait_for_requests(); + simgrid::mc::wait_for_requests(); } }