Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Manually handle the memory associated to the libevent events
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 20 Mar 2023 22:44:59 +0000 (23:44 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 20 Mar 2023 23:35:08 +0000 (00:35 +0100)
The previous version with std::unique_ptr resulted in segfaults errors
reported by valgrind, and I fail to get it right.

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

index e339675..da98ad5 100644 (file)
@@ -131,7 +131,7 @@ void CheckerSide::setup_events()
   auto* base = event_base_new();
   base_.reset(base);
 
-  auto* socket_event = event_new(
+  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<simgrid::mc::CheckerSide*>(arg);
@@ -151,10 +151,9 @@ void CheckerSide::setup_events()
         }
       },
       this);
-  event_add(socket_event, nullptr);
-  socket_event_.reset(socket_event);
+  event_add(socket_event_, nullptr);
 
-  auto* signal_event = event_new(
+  signal_event_ = event_new(
       base, SIGCHLD, EV_SIGNAL | EV_PERSIST,
       [](evutil_socket_t sig, short events, void* arg) {
         auto checker = static_cast<simgrid::mc::CheckerSide*>(arg);
@@ -168,8 +167,7 @@ void CheckerSide::setup_events()
         }
       },
       this);
-  event_add(signal_event, nullptr);
-  signal_event_.reset(signal_event);
+  event_add(signal_event_, nullptr);
 }
 
 CheckerSide::CheckerSide(const std::vector<char*>& args, bool need_memory_introspection) : running_(true)
@@ -213,6 +211,14 @@ CheckerSide::CheckerSide(const std::vector<char*>& args, bool need_memory_intros
   }
 }
 
+CheckerSide::~CheckerSide()
+{
+  event_del(socket_event_);
+  event_free(socket_event_);
+  event_del(signal_event_);
+  event_free(signal_event_);
+}
+
 void CheckerSide::dispatch_events() const
 {
   event_base_dispatch(base_.get());
index 55f7b32..3608441 100644 (file)
@@ -18,12 +18,8 @@ namespace simgrid::mc {
 /* CheckerSide: All what the checker needs to interact with a given application process */
 
 class CheckerSide {
-  void (*const free_event_fun)(event*) = [](event* evt) {
-    event_del(evt);
-    event_free(evt);
-  };
-  std::unique_ptr<event, decltype(&event_free)> socket_event_{nullptr, &event_free};
-  std::unique_ptr<event, decltype(&event_free)> signal_event_{nullptr, &event_free};
+  event* socket_event_;
+  event* signal_event_;
   std::unique_ptr<event_base, decltype(&event_base_free)> base_{nullptr, &event_base_free};
   std::unique_ptr<RemoteProcessMemory> remote_memory_;
 
@@ -37,6 +33,7 @@ class CheckerSide {
 
 public:
   explicit CheckerSide(const std::vector<char*>& args, bool need_memory_introspection);
+  ~CheckerSide();
 
   // No copy:
   CheckerSide(CheckerSide const&) = delete;