* under the terms of the license (GNU LGPL) which comes with this package. */
#include "src/mc/Session.hpp"
-#include "src/mc/checker/Checker.hpp"
-#include "src/mc/mc_config.hpp"
#include "src/internal_config.h" // HAVE_SMPI
+#include "src/mc/explo/Exploration.hpp"
+#include "src/mc/mc_config.hpp"
#if HAVE_SMPI
#include "smpi/smpi.h"
#include "src/smpi/include/private.hpp"
#endif
#include "src/mc/api/State.hpp"
+#include "src/mc/mc_exit.hpp"
#include "src/mc/mc_private.hpp"
#include "xbt/log.h"
#include "xbt/system_error.hpp"
#endif
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_Session, mc, "Model-checker session");
+XBT_LOG_EXTERNAL_CATEGORY(mc_global);
namespace simgrid {
namespace mc {
void Session::log_state() const
{
- model_checker_->getChecker()->log_state();
+ model_checker_->get_exploration()->log_state();
if (not _sg_mc_dot_output_file.get().empty()) {
fprintf(dot_output, "}\n");
return ((s_mc_message_int_t*)buff.data())->value;
}
-simgrid::mc::Session* session_singleton;
+void Session::check_deadlock() const
+{
+ xbt_assert(model_checker_->channel().send(MessageType::DEADLOCK_CHECK) == 0, "Could not check deadlock state");
+ s_mc_message_int_t message;
+ ssize_t s = model_checker_->channel().receive(message);
+ xbt_assert(s != -1, "Could not receive message");
+ xbt_assert(s == sizeof(message) && message.type == MessageType::DEADLOCK_CHECK_REPLY,
+ "Received unexpected message %s (%i, size=%i) "
+ "expected MessageType::DEADLOCK_CHECK_REPLY (%i, size=%i)",
+ to_c_str(message.type), (int)message.type, (int)s, (int)MessageType::DEADLOCK_CHECK_REPLY,
+ (int)sizeof(message));
+
+ if (message.value != 0) {
+ XBT_CINFO(mc_global, "**************************");
+ XBT_CINFO(mc_global, "*** DEADLOCK DETECTED ***");
+ XBT_CINFO(mc_global, "**************************");
+ XBT_CINFO(mc_global, "Counter-example execution trace:");
+ for (auto const& frame : model_checker_->get_exploration()->get_textual_trace())
+ XBT_CINFO(mc_global, " %s", frame.c_str());
+ XBT_CINFO(mc_global, "Path = %s", model_checker_->get_exploration()->get_record_trace().to_string().c_str());
+ log_state();
+ throw DeadlockError();
+ }
+}
}
}