Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
inline 2 more VM functions, and kill a simcall
[simgrid.git] / src / simix / libsmx.cpp
index 46a9e5e..95f8dfa 100644 (file)
@@ -295,7 +295,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 (SIMIX_vm_get_state(vm) != 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 +333,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 +415,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);
 }