-bool ModelChecker::handle_events()
-{
- char buffer[MC_MESSAGE_LENGTH];
- struct pollfd* socket_pollfd = &fds_[SOCKET_FD_INDEX];
- struct pollfd* signalfd_pollfd = &fds_[SIGNAL_FD_INDEX];
-
- while(poll(fds_, 2, -1) == -1) {
- switch(errno) {
- case EINTR:
- continue;
- default:
- throw simgrid::xbt::errno_error();
- }
- }
-
- if (socket_pollfd->revents) {
- if (socket_pollfd->revents & POLLIN) {
- ssize_t size = process_->getChannel().receive(buffer, sizeof(buffer), false);
- if (size == -1 && errno != EAGAIN)
- throw simgrid::xbt::errno_error();
- return handle_message(buffer, size);
- }
- if (socket_pollfd->revents & POLLERR)
- throw_socket_error(socket_pollfd->fd);
- if (socket_pollfd->revents & POLLHUP)
- xbt_die("Socket hang up?");
- }
-
- if (signalfd_pollfd->revents) {
- if (signalfd_pollfd->revents & POLLIN) {
- this->handle_signals();
- return true;
- }
- if (signalfd_pollfd->revents & POLLERR)
- throw_socket_error(signalfd_pollfd->fd);
- if (signalfd_pollfd->revents & POLLHUP)
- xbt_die("Signalfd hang up?");
- }
-
- return true;
-}
-
-void ModelChecker::loop()
-{
- while (this->process().running())
- this->handle_events();
-}
-
-void ModelChecker::handle_signals()
-{
- struct signalfd_siginfo info;
- struct pollfd* signalfd_pollfd = &fds_[SIGNAL_FD_INDEX];
- while (1) {
- ssize_t size = read(signalfd_pollfd->fd, &info, sizeof(info));
- if (size == -1) {
- if (errno == EINTR)
- continue;
- else
- throw simgrid::xbt::errno_error();
- } else if (size != sizeof(info))
- return throw std::runtime_error(
- "Bad communication with model-checked application");
- else
- break;
- }
- this->on_signal(&info);
-}
-