X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ebb85bd0b304300f7556e5077d294baa717ddb79..46448320f12d59d0a5efc015ec51ec6ebba525c6:/src/mc/mc_server.cpp diff --git a/src/mc/mc_server.cpp b/src/mc/mc_server.cpp index ba809845b8..b869b19f7e 100644 --- a/src/mc/mc_server.cpp +++ b/src/mc/mc_server.cpp @@ -14,6 +14,8 @@ #include #include +#include +#include #include "ModelChecker.hpp" #include "mc_protocol.h" @@ -22,6 +24,7 @@ #include "mc_ignore.h" #include "mcer_ignore.h" #include "mc_exit.h" +#include "mc/mc_liveness.h" using simgrid::mc::remote; @@ -35,20 +38,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_server, mc, "MC server logic"); mc_server_t mc_server; -struct mc_symbol_pointer_callback -{ - mc_process_t process; - void* value; -}; - -static int mc_symbol_pointer_callback_evaluate(void* p) -{ - struct mc_symbol_pointer_callback* callback = (struct mc_symbol_pointer_callback*) p; - int value; - callback->process->read_bytes(&value, sizeof(value), remote(callback->value)); - return value; -} - s_mc_server::s_mc_server(pid_t pid, int socket) { this->pid = pid; @@ -95,7 +84,7 @@ void s_mc_server::shutdown() { XBT_DEBUG("Shuting down model-checker"); - mc_process_t process = &mc_model_checker->process(); + simgrid::mc::Process* process = &mc_model_checker->process(); int status = process->status(); if (process->running()) { XBT_DEBUG("Killing process"); @@ -123,7 +112,7 @@ void s_mc_server::exit() } } -void s_mc_server::resume(mc_process_t process) +void s_mc_server::resume(simgrid::mc::Process* process) { int res = process->send_message(MC_MESSAGE_CONTINUE); if (res) @@ -188,7 +177,8 @@ bool s_mc_server::handle_events() if (size != sizeof(message)) xbt_die("Broken messsage"); memcpy(&message, buffer, sizeof(message)); - MC_heap_region_ignore_remove(message.addr, message.size); + MC_heap_region_ignore_remove( + (void *)(std::uintptr_t) message.addr, message.size); break; } @@ -199,7 +189,7 @@ bool s_mc_server::handle_events() xbt_die("Broken messsage"); memcpy(&message, buffer, sizeof(message)); mc_model_checker->process().ignore_region( - (std::uint64_t)message.addr, message.size); + message.addr, message.size); break; } @@ -222,15 +212,20 @@ bool s_mc_server::handle_events() xbt_die("Broken message"); memcpy(&message, buffer, sizeof(message)); if (message.callback) - xbt_die("Support for callbacks/functions symbols not implemented in client/server mode."); + xbt_die("Support for client-side function proposition is not implemented."); XBT_DEBUG("Received symbol: %s", message.name); - struct mc_symbol_pointer_callback* callback = xbt_new(struct mc_symbol_pointer_callback, 1); - callback->process = &mc_model_checker->process(); - callback->value = message.data; + if (_mc_property_automaton == NULL) + _mc_property_automaton = xbt_automaton_new(); + + simgrid::mc::Process* process = &mc_model_checker->process(); + simgrid::mc::remote_ptr address + = simgrid::mc::remote((int*) message.data); + simgrid::xbt::add_proposition(_mc_property_automaton, + message.name, + [process, address]() { return process->read(address); } + ); - MC_automaton_new_propositional_symbol_callback(message.name, - mc_symbol_pointer_callback_evaluate, callback, free); break; } @@ -335,7 +330,7 @@ void s_mc_server::on_signal(const struct signalfd_siginfo* info) } } -void MC_server_wait_client(mc_process_t process) +void MC_server_wait_client(simgrid::mc::Process* process) { mc_server->resume(process); while (mc_model_checker->process().running()) { @@ -344,7 +339,7 @@ void MC_server_wait_client(mc_process_t process) } } -void MC_server_simcall_handle(mc_process_t process, unsigned long pid, int value) +void MC_server_simcall_handle(simgrid::mc::Process* process, unsigned long pid, int value) { s_mc_simcall_handle_message m; memset(&m, 0, sizeof(m));