Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Pass the real pointer to the englobing MC class for the event callback.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 24 Jun 2021 07:39:48 +0000 (09:39 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 24 Jun 2021 07:39:48 +0000 (09:39 +0200)
(avoid accidental upcast)

src/mc/ModelChecker.cpp
src/mc/remote/CheckerSide.cpp
src/mc/remote/CheckerSide.hpp

index feab1c3..f44ed02 100644 (file)
@@ -40,23 +40,25 @@ ModelChecker::ModelChecker(std::unique_ptr<RemoteProcess> remote_simulation, int
 
 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;
index 013526c..ce1dfc8 100644 (file)
@@ -20,14 +20,14 @@ CheckerSide::~CheckerSide()
     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);
 }
 
index ad87d31..ff844b5 100644 (file)
@@ -6,6 +6,7 @@
 #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>
@@ -33,7 +34,7 @@ public:
   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();
 };