Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix conflict - Adrien
authoralebre <adrien.lebre@inria.fr>
Thu, 31 Jan 2013 22:45:43 +0000 (23:45 +0100)
committeralebre <adrien.lebre@inria.fr>
Thu, 31 Jan 2013 22:45:43 +0000 (23:45 +0100)
1  2 
src/msg/msg_vm.c
src/simix/smx_smurf_private.h
src/simix/smx_user.c
src/simix/smx_vm.c

Simple merge
@@@ -274,11 -274,13 +274,13 @@@ ACTION(SIMCALL_HOST_EXECUTION_GET_REMAI
  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 \
@@@ -282,16 -282,34 +282,33 @@@ e_smx_state_t simcall_host_execution_wa
   * \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);
  }
  
@@@ -69,20 -67,74 +69,74 @@@ void SIMIX_pre_vm_start(smx_simcall_t s
  }
  
  /* ***** 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.
   *
@@@ -101,9 -153,9 +155,9 @@@ void SIMIX_vm_destroy(smx_host_t ind_vm
    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);
  }