namespace simgrid::mc {
-ModelChecker::ModelChecker(std::unique_ptr<RemoteProcessMemory> remote_memory)
- : remote_process_memory_(std::move(remote_memory))
-{
-}
-
} // namespace simgrid::mc
/** State of the model-checker (global variables for the model checker)
*/
class ModelChecker {
- std::unique_ptr<RemoteProcessMemory> remote_process_memory_;
public:
ModelChecker(ModelChecker const&) = delete;
ModelChecker& operator=(ModelChecker const&) = delete;
- explicit ModelChecker(std::unique_ptr<RemoteProcessMemory> remote_simulation);
-
- RemoteProcessMemory& get_remote_process_memory() { return *remote_process_memory_; }
+ explicit ModelChecker() = default;
};
} // namespace simgrid::mc
xbt_assert(mc_model_checker == nullptr, "Did you manage to start the MC twice in this process?");
auto memory = std::make_unique<simgrid::mc::RemoteProcessMemory>(pid);
- model_checker_ = std::make_unique<simgrid::mc::ModelChecker>(std::move(memory));
+ model_checker_ = std::make_unique<simgrid::mc::ModelChecker>();
mc_model_checker = model_checker_.get();
- checker_side_ = std::make_unique<simgrid::mc::CheckerSide>(sockets[1], model_checker_.get());
+ checker_side_ = std::make_unique<simgrid::mc::CheckerSide>(sockets[1], std::move(memory), model_checker_.get());
start();
/* Take the initial snapshot */
wait_for_requests();
- initial_snapshot_ =
- std::make_shared<simgrid::mc::Snapshot>(0, page_store_, model_checker_->get_remote_process_memory());
+ initial_snapshot_ = std::make_shared<simgrid::mc::Snapshot>(0, page_store_, checker_side_->get_remote_memory());
}
RemoteApp::~RemoteApp()
}
void RemoteApp::restore_initial_state() const
{
- this->initial_snapshot_->restore(model_checker_->get_remote_process_memory());
+ this->initial_snapshot_->restore(checker_side_->get_remote_memory());
}
unsigned long RemoteApp::get_maxpid() const
Transition* handle_simcall(aid_t aid, int times_considered, bool new_transition);
/* Get the memory of the remote process */
- RemoteProcessMemory& get_remote_process_memory() { return model_checker_->get_remote_process_memory(); }
+ RemoteProcessMemory& get_remote_process_memory() { return checker_side_->get_remote_memory(); }
PageStore& get_page_store() { return page_store_; }
};
RemoteApp& remote_app)
: num(pair_num), prop_state_(prop_state)
{
- auto& memory = mc_model_checker->get_remote_process_memory();
+ auto& memory = remote_app.get_remote_process_memory();
this->app_state_ = std::move(app_state);
if (not this->app_state_->get_system_state())
this->app_state_->set_system_state(std::make_shared<Snapshot>(pair_num, remote_app.get_page_store(), memory));
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkerside, mc, "MC communication with the application");
namespace simgrid::mc {
-CheckerSide::CheckerSide(int sockfd, ModelChecker* mc) : channel_(sockfd)
+CheckerSide::CheckerSide(int sockfd, std::unique_ptr<RemoteProcessMemory> memory, ModelChecker* mc)
+ : remote_memory_(std::move(memory)), channel_(sockfd)
{
auto* base = event_base_new();
base_.reset(base);
throw simgrid::xbt::errno_error();
}
- if (not mc_model_checker->get_remote_process_memory().handle_message(buffer.data(), size))
+ if (not checker->get_remote_memory().handle_message(buffer.data(), size))
checker->break_loop();
} else {
xbt_die("Unexpected event");
auto* signal_event = event_new(
base, SIGCHLD, EV_SIGNAL | EV_PERSIST,
[](evutil_socket_t sig, short events, void* arg) {
- auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
+ auto checker = static_cast<simgrid::mc::CheckerSide*>(arg);
if (events == EV_SIGNAL) {
if (sig == SIGCHLD)
- mc->get_remote_process_memory().handle_waitpid();
+ checker->get_remote_memory().handle_waitpid();
else
xbt_die("Unexpected signal: %d", sig);
} else {
xbt_die("Unexpected event");
}
},
- mc);
+ this);
event_add(signal_event, nullptr);
signal_event_.reset(signal_event);
}
std::unique_ptr<event_base, decltype(&event_base_free)> base_{nullptr, &event_base_free};
std::unique_ptr<event, decltype(&event_free)> socket_event_{nullptr, &event_free};
std::unique_ptr<event, decltype(&event_free)> signal_event_{nullptr, &event_free};
-
+ std::unique_ptr<RemoteProcessMemory> remote_memory_;
Channel channel_;
public:
- explicit CheckerSide(int sockfd, ModelChecker* mc);
+ explicit CheckerSide(int sockfd, std::unique_ptr<RemoteProcessMemory> mem, ModelChecker* mc);
// No copy:
CheckerSide(CheckerSide const&) = delete;
Channel const& get_channel() const { return channel_; }
Channel& get_channel() { return channel_; }
+ RemoteProcessMemory& get_remote_memory() { return *remote_memory_.get(); }
void dispatch_events() const;
void break_loop() const;
using simgrid::mc::Region;
class snap_test_helper {
static simgrid::mc::PageStore page_store_;
+ static std::unique_ptr<simgrid::mc::RemoteProcessMemory> memory_;
public:
static void init_memory(void* mem, size_t size);
static void compare_region_parts();
static void read_pointer();
- static void cleanup()
- {
- delete mc_model_checker;
- mc_model_checker = nullptr;
- }
+ static void cleanup() { memory_ = nullptr; }
};
// static member variables init.
simgrid::mc::PageStore snap_test_helper::page_store_(500);
+std::unique_ptr<simgrid::mc::RemoteProcessMemory> snap_test_helper::memory_ = nullptr;
void snap_test_helper::init_memory(void* mem, size_t size)
{
REQUIRE(xbt_pagesize == getpagesize());
REQUIRE(1 << xbt_pagebits == xbt_pagesize);
- auto memory = std::make_unique<simgrid::mc::RemoteProcessMemory>(getpid());
- memory->init(nullptr);
- mc_model_checker = new ::simgrid::mc::ModelChecker(std::move(memory));
+ memory_ = std::make_unique<simgrid::mc::RemoteProcessMemory>(getpid());
+ memory_->init(nullptr);
}
snap_test_helper::prologue_return snap_test_helper::prologue(int n)
// Init memory and take snapshots:
init_memory(source, byte_size);
- auto* region0 = new simgrid::mc::Region(page_store_, mc_model_checker->get_remote_process_memory(),
- simgrid::mc::RegionType::Data, source, byte_size);
+ auto* region0 =
+ new simgrid::mc::Region(page_store_, *memory_.get(), simgrid::mc::RegionType::Data, source, byte_size);
for (int i = 0; i < n; i += 2) {
init_memory((char*)source + i * xbt_pagesize, xbt_pagesize);
}
- auto* region = new simgrid::mc::Region(page_store_, mc_model_checker->get_remote_process_memory(),
- simgrid::mc::RegionType::Data, source, byte_size);
+ auto* region = new simgrid::mc::Region(page_store_, *memory_.get(), simgrid::mc::RegionType::Data, source, byte_size);
void* destination = mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
INFO("Could not allocate destination memory");
{
prologue_return ret = prologue(1);
memcpy(ret.src, &mc_model_checker, sizeof(void*));
- const simgrid::mc::Region region2(page_store_, mc_model_checker->get_remote_process_memory(),
- simgrid::mc::RegionType::Data, ret.src, ret.size);
+ const simgrid::mc::Region region2(page_store_, *memory_.get(), simgrid::mc::RegionType::Data, ret.src, ret.size);
INFO("Mismtach in MC_region_read_pointer()");
REQUIRE(MC_region_read_pointer(®ion2, ret.src) == mc_model_checker);