X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f3b7e5f4b4d7c87ee3e8827313ec966ea8fc8387..df9f711468e4a9eb4a387acac8859003a7177bcf:/src/mc/remote/CheckerSide.hpp diff --git a/src/mc/remote/CheckerSide.hpp b/src/mc/remote/CheckerSide.hpp index 19c71e4c78..d89f7121f6 100644 --- a/src/mc/remote/CheckerSide.hpp +++ b/src/mc/remote/CheckerSide.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -6,23 +6,40 @@ #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 #include +#include -namespace simgrid { -namespace mc { +namespace simgrid::mc { + +/* CheckerSide: All what the checker needs to interact with a given application process */ class CheckerSide { - struct event_base* base_ = nullptr; - struct event* socket_event_ = nullptr; - struct event* signal_event_ = nullptr; + event* socket_event_; + event* signal_event_; + std::unique_ptr base_{nullptr, &event_base_free}; +#if SIMGRID_HAVE_STATEFUL_MC + std::unique_ptr remote_memory_; +#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(bool socket_only); // Part of the initialization + void clear_memory_cache(); + 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(int sockfd) : channel_(sockfd) {} + explicit CheckerSide(int socket, CheckerSide* child_checker); + explicit CheckerSide(const std::vector& args, bool need_memory_introspection); ~CheckerSide(); // No copy: @@ -30,15 +47,30 @@ public: CheckerSide& operator=(CheckerSide const&) = delete; CheckerSide& operator=(CheckerSide&&) = delete; + /* Communicating with the application */ Channel const& get_channel() const { return channel_; } Channel& get_channel() { return channel_; } - void start(void (*handler)(int, short, void*)); - void dispatch(); - void break_loop(); + bool handle_message(const char* buffer, ssize_t size); + void dispatch_events() const; + 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; } +#if SIMGRID_HAVE_STATEFUL_MC + RemoteProcessMemory* get_remote_memory() { return remote_memory_.get(); } +#endif }; -} // namespace mc -} // namespace simgrid +} // namespace simgrid::mc #endif