X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/68591c587de3e5700e77b27ba2ad2a2e7df4eb2f..4d4a8af70cf81e9dbc9e81cbbd76233e99d3c628:/src/mc/remote/CheckerSide.cpp diff --git a/src/mc/remote/CheckerSide.cpp b/src/mc/remote/CheckerSide.cpp index c95c8390cf..bef9b3ec7b 100644 --- a/src/mc/remote/CheckerSide.cpp +++ b/src/mc/remote/CheckerSide.cpp @@ -1,25 +1,59 @@ -/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2023. The SimGrid Team. All rights reserved. */ /* 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 "src/mc/remote/CheckerSide.hpp" +#include "src/mc/ModelChecker.hpp" +#include "xbt/system_error.hpp" #include #include -namespace simgrid { -namespace mc { +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkerside, mc, "MC communication with the application"); -void CheckerSide::start(void (*handler)(int, short, void*), ModelChecker* mc) +namespace simgrid::mc { +CheckerSide::CheckerSide(int sockfd, ModelChecker* mc) : channel_(sockfd) { auto* base = event_base_new(); base_.reset(base); - auto* socket_event = event_new(base, get_channel().get_socket(), EV_READ | EV_PERSIST, handler, mc); + auto* socket_event = event_new( + base, get_channel().get_socket(), EV_READ | EV_PERSIST, + [](evutil_socket_t sig, short events, void* arg) { + auto checker = static_cast(arg); + if (events == EV_READ) { + std::array buffer; + ssize_t size = recv(checker->get_channel().get_socket(), buffer.data(), buffer.size(), MSG_DONTWAIT); + if (size == -1) { + XBT_ERROR("Channel::receive failure: %s", strerror(errno)); + if (errno != EAGAIN) + throw simgrid::xbt::errno_error(); + } + + if (not mc_model_checker->handle_message(buffer.data(), size)) + checker->break_loop(); + } else { + xbt_die("Unexpected event"); + } + }, + this); event_add(socket_event, nullptr); socket_event_.reset(socket_event); - auto* signal_event = event_new(base, SIGCHLD, EV_SIGNAL | EV_PERSIST, handler, mc); + auto* signal_event = event_new( + base, SIGCHLD, EV_SIGNAL | EV_PERSIST, + [](evutil_socket_t sig, short events, void* arg) { + auto mc = static_cast(arg); + if (events == EV_SIGNAL) { + if (sig == SIGCHLD) + mc->handle_waitpid(); + else + xbt_die("Unexpected signal: %d", sig); + } else { + xbt_die("Unexpected event"); + } + }, + mc); event_add(signal_event, nullptr); signal_event_.reset(signal_event); } @@ -34,5 +68,4 @@ void CheckerSide::break_loop() const event_base_loopbreak(base_.get()); } -} // namespace mc -} // namespace simgrid +} // namespace simgrid::mc