void ModelChecker::start()
{
- checker_side_.start([](evutil_socket_t sig, short events, void* arg) {
- auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
- if (events == EV_READ) {
- std::array<char, MC_MESSAGE_LENGTH> buffer;
- ssize_t size = mc->checker_side_.get_channel().receive(buffer.data(), buffer.size(), false);
- if (size == -1 && errno != EAGAIN)
- throw simgrid::xbt::errno_error();
-
- if (not mc->handle_message(buffer.data(), size))
- mc->checker_side_.break_loop();
- } else if (events == EV_SIGNAL) {
- if (sig == SIGCHLD)
- mc->handle_waitpid();
- } else {
- xbt_die("Unexpected event");
- }
- });
+ checker_side_.start(
+ [](evutil_socket_t sig, short events, void* arg) {
+ auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
+ if (events == EV_READ) {
+ std::array<char, MC_MESSAGE_LENGTH> buffer;
+ ssize_t size = mc->checker_side_.get_channel().receive(buffer.data(), buffer.size(), false);
+ if (size == -1 && errno != EAGAIN)
+ throw simgrid::xbt::errno_error();
+
+ if (not mc->handle_message(buffer.data(), size))
+ mc->checker_side_.break_loop();
+ } else if (events == EV_SIGNAL) {
+ if (sig == SIGCHLD)
+ mc->handle_waitpid();
+ } else {
+ xbt_die("Unexpected event");
+ }
+ },
+ this);
XBT_DEBUG("Waiting for the model-checked process");
int status;
event_base_free(base_);
}
-void CheckerSide::start(void (*handler)(int, short, void*))
+void CheckerSide::start(void (*handler)(int, short, void*), ModelChecker* mc)
{
base_ = event_base_new();
- socket_event_ = event_new(base_, get_channel().get_socket(), EV_READ | EV_PERSIST, handler, this);
+ socket_event_ = event_new(base_, get_channel().get_socket(), EV_READ | EV_PERSIST, handler, mc);
event_add(socket_event_, nullptr);
- signal_event_ = event_new(base_, SIGCHLD, EV_SIGNAL | EV_PERSIST, handler, this);
+ signal_event_ = event_new(base_, SIGCHLD, EV_SIGNAL | EV_PERSIST, handler, mc);
event_add(signal_event_, nullptr);
}
#ifndef SIMGRID_MC_REMOTE_EVENTLOOP_HPP
#define SIMGRID_MC_REMOTE_EVENTLOOP_HPP
+#include "src/mc/mc_forward.hpp"
#include "src/mc/remote/Channel.hpp"
#include <event2/event.h>
Channel const& get_channel() const { return channel_; }
Channel& get_channel() { return channel_; }
- void start(void (*handler)(int, short, void*));
+ void start(void (*handler)(int, short, void*), ModelChecker* mc);
void dispatch();
void break_loop();
};