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.
*/
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);
+ }
+ });
}
/**
*/
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());
+
+ /* 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();
+ });
}
/**