Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
change a function as a method of simix::Host
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 1 Sep 2016 16:27:23 +0000 (18:27 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Thu, 1 Sep 2016 16:27:23 +0000 (18:27 +0200)
include/simgrid/simix.h
src/s4u/s4u_host.cpp
src/simix/smx_host.cpp
src/simix/smx_host_private.h
src/surf/surf_interface.cpp

index d1c103a..a765cd4 100644 (file)
@@ -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();
index a75aea9..d38b8e0 100644 (file)
@@ -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<simgrid::simix::Host>()->turnOn();
+      this->extension<simgrid::surf::HostImpl>()->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() {
index f27e7ac..3eb47dc 100644 (file)
@@ -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<simgrid::surf::HostImpl>();
-    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)
index 5cfdd36..38992fe 100644 (file)
@@ -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();
     };
   }
 }
index 62f899e..c9590e8 100644 (file)
@@ -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<sg_host_t> host_that_restart;
+std::vector<simgrid::s4u::Host*> host_that_restart;
 xbt_dict_t watched_hosts_lib;
 
 namespace simgrid {