X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/da4d5cc414d9f30dd2948a392f35983be63bf49a..e13d26773d3aa31c3d0eb24816470bcf8ccc26c0:/src/simix/libsmx.cpp diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 46a9e5ee92..1f15dfe8d1 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -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(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(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(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); }