X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/41966a6d30f870c0c7cc5ad5e64c0263e63970a8..df9f711468e4a9eb4a387acac8859003a7177bcf:/src/mc/remote/CheckerSide.hpp diff --git a/src/mc/remote/CheckerSide.hpp b/src/mc/remote/CheckerSide.hpp index 2461d335c3..d89f7121f6 100644 --- a/src/mc/remote/CheckerSide.hpp +++ b/src/mc/remote/CheckerSide.hpp @@ -18,21 +18,29 @@ namespace simgrid::mc { /* CheckerSide: All what the checker needs to interact with a given application process */ class CheckerSide { + event* socket_event_; + event* signal_event_; std::unique_ptr base_{nullptr, &event_base_free}; - std::unique_ptr socket_event_{nullptr, &event_free}; - std::unique_ptr signal_event_{nullptr, &event_free}; +#if SIMGRID_HAVE_STATEFUL_MC std::unique_ptr remote_memory_; - Channel channel_; +#endif + Channel channel_; bool running_ = false; pid_t pid_; + // When forking (no meminfo), the real app is our grandchild. In this case, + // child_checker_ is a CheckerSide to our child that can waitpid our grandchild on our behalf + CheckerSide* child_checker_ = nullptr; - void setup_events(); // Part of the initialization + void setup_events(bool socket_only); // Part of the initialization void clear_memory_cache(); - void handle_waitpid(); + void handle_dead_child(int status); // Launched when the dying child is the PID we follow + void handle_waitpid(); // Launched when receiving a sigchild public: - explicit CheckerSide(const std::vector& args); + explicit CheckerSide(int socket, CheckerSide* child_checker); + explicit CheckerSide(const std::vector& args, bool need_memory_introspection); + ~CheckerSide(); // No copy: CheckerSide(CheckerSide const&) = delete; @@ -48,11 +56,19 @@ public: void break_loop() const; void wait_for_requests(); + /* Create a new CheckerSide by forking the currently existing one, and connect it through the master_socket */ + std::unique_ptr clone(int master_socket, const std::string& master_socket_name); + + /** Ask the application to run post-mortem analysis, and maybe to stop ASAP */ + void finalize(bool terminate_asap = false); + /* Interacting with the application process */ pid_t get_pid() const { return pid_; } bool running() const { return running_; } void terminate() { running_ = false; } - RemoteProcessMemory& get_remote_memory() { return *remote_memory_.get(); } +#if SIMGRID_HAVE_STATEFUL_MC + RemoteProcessMemory* get_remote_memory() { return remote_memory_.get(); } +#endif }; } // namespace simgrid::mc