- base_ = event_base_new();
- event_callback_fn event_callback = [](evutil_socket_t fd, short events, void *arg)
- {
- ((ModelChecker *)arg)->handle_events(fd, events);
- };
- socket_event_ = event_new(base_, process_->get_channel().get_socket(), EV_READ | EV_PERSIST, event_callback, this);
- event_add(socket_event_, NULL);
- signal_event_ = event_new(base_,
- SIGCHLD,
- EV_SIGNAL|EV_PERSIST,
- event_callback, this);
- event_add(signal_event_, NULL);
+ checker_side_.start([](evutil_socket_t sig, short events, void* arg) {
+ auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
+ if (events == EV_READ) {
+ char buffer[MC_MESSAGE_LENGTH];
+ ssize_t size = mc->checker_side_.get_channel().receive(buffer, sizeof(buffer), false);
+ if (size == -1 && errno != EAGAIN)
+ throw simgrid::xbt::errno_error();
+
+ if (not mc->handle_message(buffer, size))
+ mc->checker_side_.break_loop();
+ } else if (events == EV_SIGNAL) {
+ if (sig == SIGCHLD)
+ mc->handle_waitpid();
+ } else {
+ xbt_die("Unexpected event");
+ }
+ });