X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dc1369e2055686dde3d178efb2001dbad8972d54..7b6fecb801d2d513ebbd7bea94c52322e2cc1df2:/src/s4u/s4u_Host.cpp diff --git a/src/s4u/s4u_Host.cpp b/src/s4u/s4u_Host.cpp index 46d86bbf9e..73195c55a4 100644 --- a/src/s4u/s4u_Host.cpp +++ b/src/s4u/s4u_Host.cpp @@ -7,7 +7,8 @@ #include "simgrid/s4u/Actor.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Exec.hpp" -#include "src/simix/smx_private.hpp" +#include "simgrid/s4u/VirtualMachine.hpp" +#include "src/plugins/vm/VirtualMachineImpl.hpp" #include "src/surf/HostImpl.hpp" #include @@ -16,8 +17,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_host, s4u, "Logging specific to the S4U hosts"); XBT_LOG_EXTERNAL_CATEGORY(surf_route); -int USER_HOST_LEVEL = -1; - namespace simgrid { namespace xbt { template class Extendable; @@ -42,8 +41,8 @@ Host::~Host() xbt_assert(currently_destroying_, "Please call h->destroy() instead of manually deleting it."); delete pimpl_; - if (pimpl_netpoint != nullptr) // not removed yet by a children class - Engine::get_instance()->netpoint_unregister(pimpl_netpoint); + if (pimpl_netpoint_ != nullptr) // not removed yet by a children class + Engine::get_instance()->netpoint_unregister(pimpl_netpoint_); delete pimpl_cpu; delete mounts_; } @@ -76,7 +75,7 @@ Host* Host::by_name_or_null(const std::string& name) Host* Host::current() { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); if (self == nullptr) xbt_die("Cannot call Host::current() from the maestro context"); return self->get_host(); @@ -85,7 +84,7 @@ Host* Host::current() void Host::turn_on() { if (not is_on()) { - simix::simcall([this] { + kernel::actor::simcall([this] { this->pimpl_cpu->turn_on(); this->pimpl_->turn_on(); on_state_change(*this); @@ -97,9 +96,15 @@ void Host::turn_on() void Host::turn_off() { if (is_on()) { - simix::simcall([this] { + kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); + kernel::actor::simcall([this, self] { + for (VirtualMachine* const& vm : vm::VirtualMachineImpl::allVms_) + if (vm->get_pm() == this) { + vm->shutdown(); + vm->turn_off(); + } this->pimpl_cpu->turn_off(); - this->pimpl_->turn_off(); + this->pimpl_->turn_off(self); on_state_change(*this); }); @@ -149,13 +154,13 @@ void Host::route_to(Host* dest, std::vector& links, double* latency) std::vector linkImpls; this->route_to(dest, linkImpls, latency); for (kernel::resource::LinkImpl* const& l : linkImpls) - links.push_back(&l->piface_); + links.push_back(l->get_iface()); } /** @brief Just like Host::routeTo, but filling an array of link implementations */ void Host::route_to(Host* dest, std::vector& links, double* latency) { - kernel::routing::NetZoneImpl::get_global_route(pimpl_netpoint, dest->pimpl_netpoint, links, latency); + kernel::routing::NetZoneImpl::get_global_route(pimpl_netpoint_, dest->get_netpoint(), links, latency); if (XBT_LOG_ISENABLED(surf_route, xbt_log_priority_debug)) { XBT_CDEBUG(surf_route, "Route from '%s' to '%s' (latency: %f):", get_cname(), dest->get_cname(), (latency == nullptr ? -1 : *latency)); @@ -164,6 +169,20 @@ void Host::route_to(Host* dest, std::vector& links, } } +/** @brief Returns the networking zone englobing that host */ +NetZone* Host::get_englobing_zone() +{ + return pimpl_netpoint_->get_englobing_zone()->get_iface(); +} + +void Host::send_to(Host* dest, double byte_amount) +{ + std::vector m_host_list = {this, dest}; + std::vector flops_amount = {0, 0}; + std::vector bytes_amount = {0, byte_amount, 0, 0}; + this_actor::parallel_execute(m_host_list, flops_amount, bytes_amount); +} + /** Get the properties assigned to a host */ const std::unordered_map* Host::get_properties() const { @@ -178,19 +197,19 @@ const char* Host::get_property(const std::string& key) const void Host::set_property(const std::string& key, const std::string& value) { - simix::simcall([this, &key, &value] { this->pimpl_->set_property(key, value); }); + kernel::actor::simcall([this, &key, &value] { this->pimpl_->set_property(key, value); }); } void Host::set_properties(const std::map& properties) { - simix::simcall([this, &properties] { this->pimpl_->set_properties(properties); }); + kernel::actor::simcall([this, &properties] { this->pimpl_->set_properties(properties); }); } /** Specify a profile turning the host on and off according to a exhaustive list or a stochastic law. * The profile must contain boolean values. */ void Host::set_state_profile(kernel::profile::Profile* p) { - return simix::simcall([this, p] { pimpl_cpu->set_state_profile(p); }); + return kernel::actor::simcall([this, p] { pimpl_cpu->set_state_profile(p); }); } /** Specify a profile modeling the external load according to a exhaustive list or a stochastic law. * @@ -200,7 +219,7 @@ void Host::set_state_profile(kernel::profile::Profile* p) */ void Host::set_speed_profile(kernel::profile::Profile* p) { - return simix::simcall([this, p] { pimpl_cpu->set_speed_profile(p); }); + return kernel::actor::simcall([this, p] { pimpl_cpu->set_speed_profile(p); }); } /** @brief Get the peak processor speed (in flops/s), at the specified pstate */ @@ -255,7 +274,7 @@ int Host::get_core_count() const /** @brief Set the pstate at which the host should run */ void Host::set_pstate(int pstate_index) { - simix::simcall([this, pstate_index] { this->pimpl_cpu->set_pstate(pstate_index); }); + kernel::actor::simcall([this, pstate_index] { this->pimpl_cpu->set_pstate(pstate_index); }); } /** @brief Retrieve the pstate at which the host is currently running */ int Host::get_pstate() const @@ -263,6 +282,20 @@ int Host::get_pstate() const return this->pimpl_cpu->get_pstate(); } +std::vector Host::get_disks() const +{ + return kernel::actor::simcall([this] { return this->pimpl_->get_disks(); }); +} + +void Host::add_disk(Disk* disk) +{ + kernel::actor::simcall([this, disk] { this->pimpl_->add_disk(disk); }); +} + +void Host::remove_disk(const std::string& disk_name) +{ + kernel::actor::simcall([this, disk_name] { this->pimpl_->remove_disk(disk_name); }); +} /** * @ingroup simix_storage_management * @brief Returns the list of storages attached to a host. @@ -270,7 +303,7 @@ int Host::get_pstate() const */ std::vector Host::get_attached_storages() const { - return simix::simcall([this] { return this->pimpl_->get_attached_storages(); }); + return kernel::actor::simcall([this] { return this->pimpl_->get_attached_storages(); }); } std::unordered_map const& Host::get_mounted_storages() @@ -278,7 +311,7 @@ std::unordered_map const& Host::get_mounted_storages() if (mounts_ == nullptr) { mounts_ = new std::unordered_map(); for (auto const& m : this->pimpl_->storage_) { - mounts_->insert({m.first, &m.second->piface_}); + mounts_->insert({m.first, m.second->get_iface()}); } } return *mounts_; @@ -353,7 +386,7 @@ xbt_dynar_t sg_hosts_as_dynar() std::vector list = simgrid::s4u::Engine::get_instance()->get_all_hosts(); auto last = std::remove_if(begin(list), end(list), [](const simgrid::s4u::Host* host) { - return not host || not host->pimpl_netpoint || not host->pimpl_netpoint->is_host(); + return not host || not host->get_netpoint() || not host->get_netpoint()->is_host(); }); std::sort(begin(list), last, [](const simgrid::s4u::Host* a, const simgrid::s4u::Host* b) { return a->get_name() < b->get_name(); }); @@ -366,17 +399,25 @@ xbt_dynar_t sg_hosts_as_dynar() // ========= Layering madness ==============* // ========== User data Layer ========== -void* sg_host_user(sg_host_t host) +void* sg_host_data(sg_host_t host) +{ + return host->get_data(); +} +void sg_host_data_set(sg_host_t host, void* userdata) { - return host->extension(USER_HOST_LEVEL); + host->set_data(userdata); } -void sg_host_user_set(sg_host_t host, void* userdata) +void* sg_host_user(sg_host_t host) // deprecated { - host->extension_set(USER_HOST_LEVEL, userdata); + return host->get_data(); } -void sg_host_user_destroy(sg_host_t host) +void sg_host_user_set(sg_host_t host, void* userdata) // deprecated { - host->extension_set(USER_HOST_LEVEL, nullptr); + host->set_data(userdata); +} +void sg_host_user_destroy(sg_host_t host) // deprecated +{ + host->set_data(nullptr); } // ========= storage related functions ============ @@ -386,8 +427,8 @@ xbt_dict_t sg_host_get_mounted_storage_list(sg_host_t host) xbt_dict_t res = xbt_dict_new_homogeneous(nullptr); for (auto const& elm : host->get_mounted_storages()) { const char* mount_name = elm.first.c_str(); - sg_storage_t storage = elm.second; - xbt_dict_set(res, mount_name, (void*)storage->get_cname(), nullptr); + const simgrid::s4u::Storage* storage = elm.second; + xbt_dict_set(res, mount_name, (void*)storage->get_cname()); } return res; @@ -501,12 +542,6 @@ int sg_host_is_on(sg_host_t host) return host->is_on(); } -/** @deprecated */ -int sg_host_is_off(sg_host_t host) -{ - return not host->is_on(); -} - /** @brief Get the properties of a host */ xbt_dict_t sg_host_get_properties(sg_host_t host) { @@ -515,7 +550,7 @@ xbt_dict_t sg_host_get_properties(sg_host_t host) if (props == nullptr) return nullptr; for (auto const& elm : *props) { - xbt_dict_set(as_dict, elm.first.c_str(), xbt_strdup(elm.second.c_str()), nullptr); + xbt_dict_set(as_dict, elm.first.c_str(), xbt_strdup(elm.second.c_str())); } return as_dict; } @@ -565,7 +600,7 @@ double sg_host_route_latency(sg_host_t from, sg_host_t to) return res; } /** - * @brief Find the bandwitdh of the route between two hosts + * @brief Find the bandwidth of the route between two hosts * * @param from where from * @param to where to @@ -584,6 +619,11 @@ double sg_host_route_bandwidth(sg_host_t from, sg_host_t to) return min_bandwidth; } +void sg_host_send_to(sg_host_t from, sg_host_t to, double byte_amount) +{ + from->send_to(to, byte_amount); +} + /** @brief Displays debugging information about a host */ void sg_host_dump(sg_host_t host) { @@ -607,25 +647,20 @@ void sg_host_dump(sg_host_t host) */ void sg_host_get_actor_list(sg_host_t host, xbt_dynar_t whereto) { - auto actors = host->get_all_actors(); - for (auto& actor : actors) + auto const actors = host->get_all_actors(); + for (auto const& actor : actors) xbt_dynar_push(whereto, &actor); } sg_host_t sg_host_self() { - smx_actor_t process = SIMIX_process_self(); - return (process == nullptr) ? nullptr : process->get_host(); + return SIMIX_is_maestro() ? nullptr : simgrid::kernel::actor::ActorImpl::self()->get_host(); } /* needs to be public and without simcall for exceptions and logging events */ const char* sg_host_self_get_name() { - sg_host_t host = sg_host_self(); - if (host == nullptr || SIMIX_process_self() == simix_global->maestro_process) - return ""; - - return host->get_cname(); + return SIMIX_is_maestro() ? "" : simgrid::kernel::actor::ActorImpl::self()->get_host()->get_cname(); } double sg_host_load(sg_host_t host)