Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
more VM functions inlining (plus, getters don't need to be a simcall)
[simgrid.git] / src / simix / libsmx.cpp
index 46a9e5e..1f15dfe 100644 (file)
@@ -205,18 +205,6 @@ void simcall_vm_start(sg_host_t vm)
   simgrid::simix::kernelImmediate(std::bind(SIMIX_vm_start, vm));
 }
 
-/**
- * \ingroup simix_vm_management
- * \brief Get the state of the given VM
- *
- * \param vm VM
- * \return The state of the VM
- */
-int simcall_vm_get_state(sg_host_t vm)
-{
-  return simgrid::simix::kernelImmediate(std::bind(SIMIX_vm_get_state, vm));
-}
-
 /**
  * \ingroup simix_vm_management
  * \brief Get the physical host on which the given VM runs.
@@ -295,7 +283,23 @@ void simcall_vm_save(sg_host_t vm)
  */
 void simcall_vm_restore(sg_host_t vm)
 {
-  simcall_BODY_vm_restore(vm);
+  simgrid::simix::kernelImmediate([vm]() {
+    if (static_cast<simgrid::s4u::VirtualMachine*>(vm)->pimpl_vm_->getState() != SURF_VM_STATE_SAVED)
+      THROWF(vm_error, 0, "VM(%s) was not saved", vm->name().c_str());
+
+    XBT_DEBUG("restore VM(%s), where %d processes exist", vm->name().c_str(),
+              xbt_swag_size(sg_host_simix(vm)->process_list));
+
+    /* jump to vm_ws_restore() */
+    static_cast<simgrid::s4u::VirtualMachine*>(vm)->pimpl_vm_->restore();
+
+    smx_actor_t smx_process, smx_process_safe;
+    xbt_swag_foreach_safe(smx_process, smx_process_safe, sg_host_simix(vm)->process_list)
+    {
+      XBT_DEBUG("resume %s", smx_process->name.c_str());
+      SIMIX_process_resume(smx_process);
+    }
+  });
 }
 
 /**
@@ -317,26 +321,24 @@ void simcall_vm_shutdown(sg_host_t vm)
  */
 void simcall_vm_destroy(sg_host_t vm)
 {
-  simgrid::simix::kernelImmediate(std::bind(SIMIX_vm_destroy, vm));
-}
+  simgrid::simix::kernelImmediate([vm]() {
+    /* this code basically performs a similar thing like SIMIX_host_destroy() */
+    XBT_DEBUG("destroy %s", vm->name().c_str());
 
-/**
- * \ingroup simix_vm_management
- * \brief Encompassing simcall to prevent the removal of the src or the dst node at the end of a VM migration
- *  The simcall actually invokes the following calls: 
- *     simcall_vm_migrate(vm, dst_pm); 
- *     simcall_vm_resume(vm);
- *
- * It is called at the end of the migration_rx_fun function from msg/msg_vm.c
- *
- * \param vm VM to migrate
- * \param src_pm  Source physical host
- * \param dst_pmt Destination physical host
- */
-void simcall_vm_migratefrom_resumeto(sg_host_t vm, sg_host_t src_pm, sg_host_t dst_pm)
-{
-  simgrid::simix::kernelImmediate(std::bind(
-    SIMIX_vm_migratefrom_resumeto, vm, src_pm, dst_pm));
+    /* FIXME: this is really strange that everything fails if the next line is removed.
+     * This is as if we shared these data with the PM, which definitely should not be the case...
+     *
+     * We need to test that suspending a VM does not suspends the processes running on its PM, for example.
+     * Or we need to simplify this code enough to make it actually readable (but this sounds harder than testing)
+     */
+    vm->extension_set<simgrid::simix::Host>(nullptr);
+
+    /* Don't free these things twice: they are the ones of my physical host */
+    vm->pimpl_cpu     = nullptr;
+    vm->pimpl_netcard = nullptr;
+
+    vm->destroy();
+  });
 }
 
 /**
@@ -401,8 +403,6 @@ void simcall_process_join(smx_actor_t process, double timeout)
  */
 void simcall_process_suspend(smx_actor_t process)
 {
-  xbt_assert(process, "Invalid parameters");
-
   simcall_BODY_process_suspend(process);
 }