Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge selected changes from branch 'simgrid-Jesse-McDonald-master-patch-09242'
[simgrid.git] / src / mc / transition / Transition.cpp
1 /* Copyright (c) 2015-2022. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include "src/mc/transition/Transition.hpp"
7 #include "xbt/asserts.h"
8 #include "xbt/string.hpp"
9 #include <simgrid/config.h>
10
11 #if SIMGRID_HAVE_MC
12 #include "src/mc/ModelChecker.hpp"
13 #include "src/mc/transition/TransitionAny.hpp"
14 #include "src/mc/transition/TransitionComm.hpp"
15 #include "src/mc/transition/TransitionRandom.hpp"
16 #include "src/mc/transition/TransitionSynchro.hpp"
17 #endif
18
19 #include <sstream>
20
21 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_transition, mc, "Logging specific to MC transitions");
22
23 namespace simgrid::mc {
24 unsigned long Transition::executed_transitions_ = 0;
25 unsigned long Transition::replayed_transitions_ = 0;
26
27 // Do not move this to the header, to ensure that we have a vtable for Transition
28 Transition::~Transition() = default;
29
30 std::string Transition::to_string(bool) const
31 {
32   return "";
33 }
34 std::string Transition::dot_string() const
35 {
36   static constexpr std::array<const char*, 13> colors{{"blue", "red", "green3", "goldenrod", "brown", "purple",
37                                                        "magenta", "turquoise4", "gray25", "forestgreen", "hotpink",
38                                                        "lightblue", "tan"}};
39   const char* color = colors[(aid_ - 1) % colors.size()];
40
41   return xbt::string_printf("label = \"[(%ld)] %s\", color = %s, fontcolor = %s", aid_, Transition::to_c_str(type_),
42                             color, color);
43 }
44 void Transition::replay() const
45 {
46   replayed_transitions_++;
47
48 #if SIMGRID_HAVE_MC
49   mc_model_checker->handle_simcall(aid_, times_considered_, false);
50   mc_model_checker->wait_for_requests();
51 #endif
52 }
53
54 Transition* deserialize_transition(aid_t issuer, int times_considered, std::stringstream& stream)
55 {
56 #if SIMGRID_HAVE_MC
57   short type;
58   xbt_assert(stream >> type);
59
60   switch (auto simcall = static_cast<Transition::Type>(type)) {
61     case Transition::Type::BARRIER_LOCK:
62     case Transition::Type::BARRIER_WAIT:
63       return new BarrierTransition(issuer, times_considered, simcall, stream);
64
65     case Transition::Type::COMM_RECV:
66       return new CommRecvTransition(issuer, times_considered, stream);
67     case Transition::Type::COMM_SEND:
68       return new CommSendTransition(issuer, times_considered, stream);
69     case Transition::Type::COMM_TEST:
70       return new CommTestTransition(issuer, times_considered, stream);
71     case Transition::Type::COMM_WAIT:
72       return new CommWaitTransition(issuer, times_considered, stream);
73
74     case Transition::Type::TESTANY:
75       return new TestAnyTransition(issuer, times_considered, stream);
76     case Transition::Type::WAITANY:
77       return new WaitAnyTransition(issuer, times_considered, stream);
78
79     case Transition::Type::RANDOM:
80       return new RandomTransition(issuer, times_considered, stream);
81
82     case Transition::Type::MUTEX_TRYLOCK:
83     case Transition::Type::MUTEX_LOCK:
84     case Transition::Type::MUTEX_TEST:
85     case Transition::Type::MUTEX_WAIT:
86     case Transition::Type::MUTEX_UNLOCK:
87       return new MutexTransition(issuer, times_considered, simcall, stream);
88
89     case Transition::Type::SEM_LOCK:
90     case Transition::Type::SEM_UNLOCK:
91     case Transition::Type::SEM_WAIT:
92       return new SemaphoreTransition(issuer, times_considered, simcall, stream);
93
94     case Transition::Type::UNKNOWN:
95       return new Transition(Transition::Type::UNKNOWN, issuer, times_considered);
96
97     default:
98       break;
99   }
100   xbt_die("Invalid transition type %d received", type);
101 #else
102   xbt_die("Deserializing transitions is only interesting in MC mode.");
103 #endif
104 }
105
106 } // namespace simgrid::mc