#include "src/kernel/resource/SplitDuplexLinkImpl.hpp"
#include "src/kernel/resource/StandardLinkImpl.hpp"
#include "src/mc/mc_replay.hpp"
+#include "src/surf/HostImpl.hpp"
#include "xbt/config.hpp"
#include <algorithm>
static simgrid::kernel::actor::ActorCode maestro_code;
-namespace simgrid {
-namespace s4u {
+namespace simgrid::s4u {
xbt::signal<void()> Engine::on_platform_creation;
xbt::signal<void()> Engine::on_platform_created;
xbt::signal<void()> Engine::on_simulation_start;
/** Returns the amount of hosts in the platform */
size_t Engine::get_host_count() const
{
- return pimpl->hosts_.size();
+ return get_all_hosts().size();
}
std::vector<Host*> Engine::get_all_hosts() const
{
- std::vector<Host*> res;
- for (auto const& kv : pimpl->hosts_)
- res.push_back(kv.second);
- return res;
+ return get_filtered_hosts([](const Host*) { return true; });
}
std::vector<Host*> Engine::get_filtered_hosts(const std::function<bool(Host*)>& filter) const
{
std::vector<Host*> hosts;
- for (auto const& kv : pimpl->hosts_) {
- if (filter(kv.second))
- hosts.push_back(kv.second);
+ if (pimpl->netzone_root_) {
+ hosts = pimpl->netzone_root_->get_filtered_hosts(filter);
}
+ /* Sort hosts in lexicographical order: keep same behavior when the hosts were saved on Engine
+ * Some tests do a get_all_hosts() and selects hosts in this order */
+ std::sort(hosts.begin(), hosts.end(), [](const auto* h1, const auto* h2) { return h1->get_name() < h2->get_name(); });
return hosts;
}
-void Engine::host_register(const std::string& name, Host* host)
-{
- pimpl->hosts_[name] = host;
-}
-
-void Engine::host_unregister(const std::string& name)
-{
- pimpl->hosts_.erase(name);
-}
-
/** @brief Find a host from its name.
*
* @throw std::invalid_argument if the searched host does not exist.
*/
Host* Engine::host_by_name(const std::string& name) const
{
- auto host = pimpl->hosts_.find(name);
- if (host == pimpl->hosts_.end())
+ auto* host = host_by_name_or_null(name);
+ if (not host)
throw std::invalid_argument(std::string("Host not found: '") + name + std::string("'"));
- return host->second;
+ return host;
}
/** @brief Find a host from its name (or nullptr if that host does not exist) */
Host* Engine::host_by_name_or_null(const std::string& name) const
{
- auto host = pimpl->hosts_.find(name);
- return host == pimpl->hosts_.end() ? nullptr : host->second;
+ Host* host = nullptr;
+ if (pimpl->netzone_root_) {
+ auto* host_impl = pimpl->netzone_root_->get_host_by_name_or_null(name);
+ if (host_impl)
+ host = host_impl->get_iface();
+ }
+ return host;
}
/** @brief Find a link from its name.
{
/* two actors may have pushed the same mbox_create simcall at the same time */
kernel::activity::MailboxImpl* mbox = kernel::actor::simcall_answered([&name, this] {
- auto m = pimpl->mailboxes_.emplace(name, nullptr);
- if (m.second) {
- m.first->second = new kernel::activity::MailboxImpl(name);
- XBT_DEBUG("Creating a mailbox at %p with name %s", m.first->second, name.c_str());
+ auto [m, inserted] = pimpl->mailboxes_.try_emplace(name, nullptr);
+ if (inserted) {
+ m->second = new kernel::activity::MailboxImpl(name);
+ XBT_DEBUG("Creating a mailbox at %p with name %s", m->second, name.c_str());
}
- return m.first->second;
+ return m->second;
});
return mbox->get_iface();
}
/** @brief Returns the list of all links found in the platform */
std::vector<Link*> Engine::get_all_links() const
{
- return get_filtered_links([](Link*) { return true; });
+ return get_filtered_links([](const Link*) { return true; });
}
std::vector<Link*> Engine::get_filtered_links(const std::function<bool(Link*)>& filter) const
std::vector<ActorPtr> Engine::get_all_actors() const
{
std::vector<ActorPtr> actor_list;
- for (auto const& kv : pimpl->get_actor_list()) {
- actor_list.push_back(kv.second->get_iface());
+ for (auto const& [_, actor] : pimpl->get_actor_list()) {
+ actor_list.push_back(actor->get_iface());
}
return actor_list;
}
std::vector<ActorPtr> Engine::get_filtered_actors(const std::function<bool(ActorPtr)>& filter) const
{
std::vector<ActorPtr> actor_list;
- for (auto const& kv : pimpl->get_actor_list()) {
- if (filter(kv.second->get_iface()))
- actor_list.push_back(kv.second->get_iface());
+ for (auto const& [_, actor] : pimpl->get_actor_list()) {
+ if (filter(actor->get_iface()))
+ actor_list.push_back(actor->get_iface());
}
return actor_list;
}
}
void Engine::run_until(double max_date) const
{
- static bool callback_called = false;
- if (not callback_called) {
+ if (static bool callback_called = false; not callback_called) {
on_simulation_start();
callback_called = true;
}
std::vector<kernel::routing::NetPoint*> Engine::get_all_netpoints() const
{
std::vector<kernel::routing::NetPoint*> res;
- for (auto const& kv : pimpl->netpoints_)
- res.push_back(kv.second);
+ for (auto const& [_, netpoint] : pimpl->netpoints_)
+ res.push_back(netpoint);
return res;
}
return this;
}
-} // namespace s4u
-} // namespace simgrid
+} // namespace simgrid::s4u
/* **************************** Public C interface *************************** */
void simgrid_init(int* argc, char** argv)