ACTION(SIMCALL_HOST_EXECUTION_GET_STATE, host_execution_get_state, WITH_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
ACTION(SIMCALL_HOST_EXECUTION_SET_PRIORITY, host_execution_set_priority, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t), TDOUBLE(priority)) sep \
ACTION(SIMCALL_HOST_EXECUTION_WAIT, host_execution_wait, WITHOUT_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_VM_CREATE, vm_create, WITH_ANSWER, TPTR(result), TSTRING(name), TSPEC(phys_host, smx_host_t)) sep \
-ACTION(SIMCALL_VM_START, vm_start, WITHOUT_ANSWER, TVOID(result), TSPEC(phys_host, smx_host_t)) sep \
-ACTION(SIMCALL_VM_SET_STATE, vm_set_state, WITHOUT_ANSWER, TVOID(result), TSPEC(vm, smx_host_t), TINT(state)) sep \
-ACTION(SIMCALL_VM_GET_STATE, vm_get_state, WITH_ANSWER, TINT(result), TSPEC(vm, smx_host_t)) sep \
+ACTION(SIMCALL_VM_WS_CREATE, vm_ws_create, WITH_ANSWER, TPTR(result), TSTRING(name), TSPEC(phys_host, smx_host_t)) sep \
+ACTION(SIMCALL_VM_START, vm_start, WITHOUT_ANSWER, TVOID(result), TSPEC(ind_phys_host, smx_host_t)) sep \
+ACTION(SIMCALL_VM_SET_STATE, vm_set_state, WITHOUT_ANSWER, TVOID(result), TSPEC(ind_vm, smx_host_t), TINT(state)) sep \
+ACTION(SIMCALL_VM_GET_STATE, vm_get_state, WITH_ANSWER, TINT(result), TSPEC(ind_vm, smx_host_t)) sep \
+ACTION(SIMCALL_VM_DESTROY, vm_destroy, WITHOUT_ANSWER, TVOID(result), TSPEC(ind_vm, smx_host_t)) sep \
+ ACTION(SIMCALL_VM_SUSPEND, vm_suspend, WITHOUT_ANSWER, TVOID(result), TSPEC(vm, smx_host_t)) sep \
+ ACTION(SIMCALL_VM_SHUTDOWN, vm_shutdown, WITHOUT_ANSWER, TVOID(result), TSPEC(vm, smx_host_t)) sep \
-ACTION(SIMCALL_VM_DESTROY, vm_destroy, WITHOUT_ANSWER, TVOID(result), TSPEC(vm, smx_host_t)) sep \
ACTION(SIMCALL_PROCESS_CREATE, process_create, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t*), TSTRING(name), TSPEC(code, xbt_main_func_t), TPTR(data), TSTRING(hostname), TDOUBLE(kill_time), TINT(argc), TSPEC(argv, char**), TSPEC(properties, xbt_dict_t), TINT(auto_restart)) sep \
ACTION(SIMCALL_PROCESS_KILL, process_kill, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
ACTION(SIMCALL_PROCESS_KILLALL, process_killall, WITH_ANSWER, TVOID(result)) sep \
* \param host A host
* \return The properties of this host
*/
-void* simcall_vm_create(const char *name, smx_host_t phys_host)
-{
- return simcall_BODY_vm_create(name, phys_host);
+void* simcall_vm_ws_create(const char *name, smx_host_t phys_host){
+ return simcall_BODY_vm_ws_create(name, phys_host);
}
-void simcall_vm_start(smx_host_t vm)
+void simcall_vm_start(smx_host_t vm) {
+ {
+ simcall_BODY_set_vm_state(vm, msg_vm_state_running);
+ }
- simcall_BODY_set_vm_state(vm, msg_vm_state_running);
+ void simcall_vm_suspend(smx_host_t vm)
+ {
+ /* will jump to SIMIX_pre_vm_suspend */
+ simcall_BODY_vm_suspend(vm);
}
- void simcall_vm_destroy(smx_host_t vm) {
+ void simcall_vm_shutdown(smx_host_t vm)
+ {
+ /* will jump to SIMIX_pre_vm_shutdown */
+ simcall_BODY_vm_shutdown(vm);
+ }
+
+ void simcall_vm_destroy(smx_host_t vm)
+ {
+ /*
+ * simcall_BODY_ is defined in src/simix/smx_smurf_private.h.
+ * This function will jump to SIMIX_pre_vm_destroy.
+ **/
simcall_BODY_vm_destroy(vm);
}
}
/* ***** set/get state of a VM ***** */
-void SIMIX_set_vm_state(smx_host_t vm, int state){
- surf_vm_workstation_model->extension.vm_workstation.set_state(vm, state);
+void SIMIX_set_vm_state(smx_host_t ind_vm, int state){
+ surf_vm_workstation_model->extension.vm_workstation.set_state(ind_vm, state);
}
-void SIMIX_prev_set_vm_state(smx_host_t vm, int state){
- SIMIX_set_vm_state(vm, state);
+void SIMIX_prev_set_vm_state(smx_host_t ind_vm, int state){
+ SIMIX_set_vm_state(ind_vm, state);
}
-int SIMIX_get_vm_state(smx_host_t vm){
- return surf_vm_workstation_model->extension.vm_workstation.get_state(vm);
+int SIMIX_get_vm_state(smx_host_t ind_vm){
+ return surf_vm_workstation_model->extension.vm_workstation.get_state(ind_vm);
}
-int SIMIX_pre_vm_state(smx_host_t vm){
- return SIMIX_get_vm_state(vm);
+int SIMIX_pre_vm_state(smx_host_t ind_vm){
+ return SIMIX_get_vm_state(ind_vm);
}
+ /**
+ * \brief Function to suspend a SIMIX VM host. This function powers off the
+ * VM. All the processes on this VM will be killed. But, the state of the VM is
+ * perserved. We can later start it again.
+ *
+ * \param host the vm host to suspend (a smx_host_t)
+ */
+ void SIMIX_vm_suspend(smx_host_t host)
+ {
+ /* TODO: check state */
+
+ XBT_DEBUG("%lu processes in the VM", xbt_swag_size(SIMIX_host_priv(host)->process_list));
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(host)->process_list) {
+ XBT_DEBUG("suspend %s", SIMIX_host_get_name(host));
+ simcall_process_suspend(smx_process);
+ }
+
+ /* TODO: Using the variable of the MSG layer is not clean. */
+ SIMIX_set_vm_state(host, msg_vm_state_suspended);
+ }
+
+ void SIMIX_pre_vm_suspend(smx_simcall_t simcall, smx_host_t vm){
+ SIMIX_vm_suspend(vm);
+ }
+
+ /**
+ * \brief Function to shutdown a SIMIX VM host. This function powers off the
+ * VM. All the processes on this VM will be killed. But, the state of the VM is
+ * perserved. We can later start it again.
+ *
+ * \param host the vm host to shutdown (a smx_host_t)
+ */
+ void SIMIX_vm_shutdown(smx_host_t host)
+ {
+ /* TODO: check state */
+
+ XBT_DEBUG("%lu processes in the VM", xbt_swag_size(SIMIX_host_priv(host)->process_list));
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(host)->process_list) {
+ XBT_DEBUG("kill %s", SIMIX_host_get_name(host));
+ simcall_process_kill(smx_process);
+ }
+
+ /* TODO: Using the variable of the MSG layer is not clean. */
+ SIMIX_set_vm_state(host, msg_vm_state_sleeping);
+ }
+
+ void SIMIX_pre_vm_shutdown(smx_simcall_t simcall, smx_host_t vm){
+ SIMIX_vm_shutdown(vm);
+ }
+
/**
* \brief Function to destroy a SIMIX VM host.
*
xbt_lib_unset(host_lib, hostname, SIMIX_HOST_LEVEL);
/* jump to vm_ws_destroy(). The surf level resource will be freed. */
- surf_vm_workstation_model->extension.vm_workstation.destroy(host);
+ surf_vm_workstation_model->extension.vm_workstation.destroy(ind_vm);
}
- void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t ind_vm){
- SIMIX_vm_destroy(ind_vm);
+ void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t vm){
+ SIMIX_vm_destroy(vm);
}