X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9e3b2f1d55a07271c05db2ed5b3fec27561097f9..08a29a4221dc5cec95b766cd9b25c95dcc361df9:/src/s4u/s4u_Host.cpp?ds=sidebyside diff --git a/src/s4u/s4u_Host.cpp b/src/s4u/s4u_Host.cpp index 5e6879cbbb..ee79d4175d 100644 --- a/src/s4u/s4u_Host.cpp +++ b/src/s4u/s4u_Host.cpp @@ -7,6 +7,7 @@ #include "simgrid/s4u/Actor.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Exec.hpp" +#include "src/simix/smx_private.hpp" #include "src/surf/HostImpl.hpp" #include @@ -31,14 +32,14 @@ simgrid::xbt::signal Host::on_speed_change; Host::Host(std::string name) : name_(std::move(name)) { - xbt_assert(Host::by_name_or_null(name_) == nullptr, "Refusing to create a second host named '%s'.", name_.c_str()); + xbt_assert(Host::by_name_or_null(name_) == nullptr, "Refusing to create a second host named '%s'.", get_cname()); Engine::get_instance()->host_register(std::string(name_), this); new simgrid::surf::HostImpl(this); } Host::~Host() { - xbt_assert(currentlyDestroying_, "Please call h->destroy() instead of manually deleting it."); + 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 @@ -57,8 +58,8 @@ Host::~Host() */ void Host::destroy() { - if (not currentlyDestroying_) { - currentlyDestroying_ = true; + if (not currently_destroying_) { + currently_destroying_ = true; on_destruction(*this); Engine::get_instance()->host_unregister(std::string(name_)); delete this; @@ -76,10 +77,10 @@ Host* Host::by_name_or_null(const std::string& name) Host* Host::current() { - smx_actor_t smx_proc = SIMIX_process_self(); - if (smx_proc == nullptr) + smx_actor_t self = SIMIX_process_self(); + if (self == nullptr) xbt_die("Cannot call Host::current() from the maestro context"); - return smx_proc->host_; + return self->get_host(); } void Host::turn_on() @@ -304,7 +305,7 @@ std::unordered_map const& Host::get_mounted_storages() ExecPtr Host::exec_async(double flops) { - return this_actor::exec_init(flops)->set_host(this); + return this_actor::exec_init(flops); } void Host::execute(double flops) @@ -314,7 +315,7 @@ void Host::execute(double flops) void Host::execute(double flops, double priority) { - this_actor::exec_init(flops)->set_host(this)->set_priority(1 / priority)->start()->wait(); + this_actor::exec_init(flops)->set_priority(1 / priority)->start()->wait(); } } // namespace s4u @@ -366,12 +367,6 @@ sg_host_t sg_host_by_name(const char* name) return simgrid::s4u::Host::by_name_or_null(name); } -static int hostcmp_voidp(const void* pa, const void* pb) -{ - return strcmp((*static_cast(pa))->get_cname(), - (*static_cast(pb))->get_cname()); -} - xbt_dynar_t sg_hosts_as_dynar() { xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), nullptr); @@ -382,7 +377,11 @@ xbt_dynar_t sg_hosts_as_dynar() if (host && host->pimpl_netpoint && host->pimpl_netpoint->is_host()) xbt_dynar_push(res, &host); } - xbt_dynar_sort(res, hostcmp_voidp); + xbt_dynar_sort(res, [](const void* pa, const void* pb) { + const std::string& na = (*static_cast(pa))->get_name(); + const std::string& nb = (*static_cast(pb))->get_name(); + return na.compare(nb); + }); return res; } @@ -638,7 +637,17 @@ void sg_host_get_actor_list(sg_host_t host, xbt_dynar_t whereto) sg_host_t sg_host_self() { smx_actor_t process = SIMIX_process_self(); - return (process == nullptr) ? nullptr : process->host_; + return (process == nullptr) ? nullptr : process->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(); } double sg_host_load(sg_host_t host)