for (auto const& [_, mailbox] : mailboxes_)
delete mailbox;
+ for (auto const& [_, queue] : mqueues_)
+ delete queue;
+
/* Kill all actors (but maestro) */
maestro_->kill_all();
run_all_actors();
install_signal_handlers();
- /* register a function to be called after the environment creation */
- s4u::Engine::on_platform_created_cb([this]() { this->presolve(); });
-
if (cfg_dbg_clean_atexit)
atexit(shutdown);
}
sg_platf_parser_finalize();
simgrid_parse_open(file);
- simgrid_parse();
+ simgrid_parse(false);
simgrid_parse_close();
}
while (auto* action = model->extract_failed_action()) {
XBT_DEBUG(" Handling Action %p", action);
if (action->get_activity() != nullptr) { // Skip vcpu actions
+ activity::ActivityImplPtr activity(action->get_activity());
// Action failures are not automatically reported when the action is started by maestro (as in SimDAG)
- if (action->get_activity()->get_actor() == maestro_)
- action->get_activity()->get_iface()->complete(s4u::Activity::State::FAILED);
+ if (activity->get_actor() == maestro_)
+ activity->get_iface()->complete(s4u::Activity::State::FAILED);
- activity::ActivityImplPtr(action->get_activity())->finish();
+ activity->finish();
}
}
XBT_DEBUG("Handling the terminated actions (if any)");
while (auto* action = model->extract_done_action()) {
XBT_DEBUG(" Handling Action %p", action);
if (action->get_activity() != nullptr) {
+ activity::ActivityImplPtr activity(action->get_activity());
+
// Action termination are not automatically reported when the action is started by maestro (as in SimDAG)
- action->get_activity()->set_finish_time(action->get_finish_time());
+ activity->set_finish_time(action->get_finish_time());
- if (action->get_activity()->get_actor() == maestro_)
- action->get_activity()->get_iface()->complete(s4u::Activity::State::FINISHED);
+ if (activity->get_actor() == maestro_)
+ activity->get_iface()->complete(s4u::Activity::State::FINISHED);
- activity::ActivityImplPtr(action->get_activity())->finish();
+ activity->finish();
}
}
}
if (boost::dynamic_pointer_cast<kernel::activity::CommImpl>(actor->waiting_synchro_) != nullptr)
synchro_description = "communication";
+ if (boost::dynamic_pointer_cast<kernel::activity::MessImpl>(actor->waiting_synchro_) != nullptr)
+ synchro_description = "message";
+
if (boost::dynamic_pointer_cast<kernel::activity::SleepImpl>(actor->waiting_synchro_) != nullptr)
synchro_description = "sleeping";
}
}
-void EngineImpl::presolve() const
-{
- XBT_DEBUG("Consume all trace events occurring before the starting time.");
- double next_event_date;
- while ((next_event_date = profile::future_evt_set.next_date()) != -1.0) {
- if (next_event_date > now_)
- break;
-
- double value = -1.0;
- resource::Resource* resource = nullptr;
- while (auto* event = profile::future_evt_set.pop_leq(next_event_date, &value, &resource)) {
- if (value >= 0)
- resource->apply_event(event, value);
- }
- }
-
- XBT_DEBUG("Set every models in the right state by updating them to 0.");
- for (auto const& model : models_)
- model->update_actions_state(now_, 0.0);
-}
-
double EngineImpl::solve(double max_date) const
{
double time_delta = -1.0; /* duration */
}
XBT_DEBUG("Looking for next event in all models");
- for (auto model : models_) {
+ for (auto* model : models_) {
if (not model->next_occurring_event_is_idempotent())
continue;
double next_event_date = profile::future_evt_set.next_date();
XBT_DEBUG("Next TRACE event: %f", next_event_date);
- for (auto model : models_) {
+ for (auto* model : models_) {
/* Skip all idempotent models, they were already treated above
* NS3 is the one to handled here */
if (model->next_occurring_event_is_idempotent())