From 80a6bd086a056f455d97da1d07802ce8ffd60ed7 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Thu, 1 Sep 2016 18:27:23 +0200 Subject: [PATCH] change a function as a method of simix::Host --- include/simgrid/simix.h | 1 - src/s4u/s4u_host.cpp | 11 ++++-- src/simix/smx_host.cpp | 68 ++++++++++++++++-------------------- src/simix/smx_host_private.h | 2 ++ src/surf/surf_interface.cpp | 2 +- 5 files changed, 43 insertions(+), 41 deletions(-) diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index d1c103a933..a765cd4261 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -205,7 +205,6 @@ XBT_PUBLIC(void) SIMIX_process_detach(); /*********************************** Host *************************************/ XBT_PUBLIC(sg_host_t) SIMIX_host_self(); XBT_PUBLIC(const char*) SIMIX_host_self_get_name(); -XBT_PUBLIC(void) SIMIX_host_on(sg_host_t host); XBT_PUBLIC(void) SIMIX_host_off(sg_host_t host, smx_actor_t issuer); XBT_PUBLIC(void) SIMIX_host_self_set_data(void *data); XBT_PUBLIC(void*) SIMIX_host_self_get_data(); diff --git a/src/s4u/s4u_host.cpp b/src/s4u/s4u_host.cpp index a75aea9657..d38b8e03f2 100644 --- a/src/s4u/s4u_host.cpp +++ b/src/s4u/s4u_host.cpp @@ -75,11 +75,18 @@ Host *Host::current(){ } void Host::turnOn() { - simgrid::simix::kernelImmediate(std::bind(SIMIX_host_on, this)); + if (isOff()) { + simgrid::simix::kernelImmediate([&]{ + this->extension()->turnOn(); + this->extension()->turnOn(); + }); + } } void Host::turnOff() { - simgrid::simix::kernelImmediate(std::bind(SIMIX_host_off, this, SIMIX_process_self())); + if (isOn()) { + simgrid::simix::kernelImmediate(std::bind(SIMIX_host_off, this, SIMIX_process_self())); + } } bool Host::isOn() { diff --git a/src/simix/smx_host.cpp b/src/simix/smx_host.cpp index f27e7accb6..3eb47dcbf0 100644 --- a/src/simix/smx_host.cpp +++ b/src/simix/smx_host.cpp @@ -50,46 +50,40 @@ namespace simgrid { xbt_dynar_free(&boot_processes); xbt_swag_free(process_list); } - } -} - -/** @brief Start the host if it is off */ -void SIMIX_host_on(sg_host_t h) -{ - smx_host_priv_t host = sg_host_simix(h); - - xbt_assert((host != nullptr), "Invalid parameters"); - if (h->isOff()) { - simgrid::surf::HostImpl* surf_host = h->extension(); - surf_host->turnOn(); - - unsigned int cpt; - smx_process_arg_t arg; - xbt_dynar_foreach(host->boot_processes,cpt,arg) { - XBT_DEBUG("Booting Process %s(%s) right now", - arg->name.c_str(), arg->hostname); - if (simix_global->create_process_function) { - simix_global->create_process_function(arg->name.c_str(), - arg->code, - nullptr, - arg->hostname, - arg->kill_time, - arg->properties, - arg->auto_restart, - nullptr); - } else { - simcall_process_create(arg->name.c_str(), - arg->code, - nullptr, - arg->hostname, - arg->kill_time, - arg->properties, - arg->auto_restart); + /** Re-starts all the actors that are marked as restartable. + * + * Weird things will happen if you turn on an host that is already on. S4U is fool-proof, not this. + */ + void Host::turnOn() + { + unsigned int cpt; + smx_process_arg_t arg; + xbt_dynar_foreach(boot_processes,cpt,arg) { + XBT_DEBUG("Booting Process %s(%s) right now", arg->name.c_str(), arg->hostname); + // FIXME: factorize this code by registering the simcall as default function + if (simix_global->create_process_function) { + simix_global->create_process_function(arg->name.c_str(), + arg->code, + nullptr, + arg->hostname, + arg->kill_time, + arg->properties, + arg->auto_restart, + nullptr); + } else { + simcall_process_create(arg->name.c_str(), + arg->code, + nullptr, + arg->hostname, + arg->kill_time, + arg->properties, + arg->auto_restart); + } } } - } -} + +}} // namespaces /** @brief Stop the host if it is on */ void SIMIX_host_off(sg_host_t h, smx_actor_t issuer) diff --git a/src/simix/smx_host_private.h b/src/simix/smx_host_private.h index 5cfdd36b5b..38992feef3 100644 --- a/src/simix/smx_host_private.h +++ b/src/simix/smx_host_private.h @@ -32,6 +32,8 @@ namespace simgrid { xbt_swag_t process_list; xbt_dynar_t auto_restart_processes = nullptr; xbt_dynar_t boot_processes = nullptr; + + void turnOn(); }; } } diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 62f899e02c..c9590e81d8 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -33,7 +33,7 @@ xbt_dynar_t model_list_invoke = nullptr; /* to invoke callbacks */ simgrid::trace_mgr::future_evt_set *future_evt_set = nullptr; xbt_dynar_t surf_path = nullptr; -std::vector host_that_restart; +std::vector host_that_restart; xbt_dict_t watched_hosts_lib; namespace simgrid { -- 2.20.1