Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make SIMIX_req_host_execution_wait to also destroy the execution action when done.
[simgrid.git] / src / simix / smx_host.c
index a85b8ff..de979cc 100644 (file)
@@ -178,7 +178,8 @@ void SIMIX_host_set_data(smx_host_t host, void *data)
 }
 
 smx_action_t SIMIX_host_execute(const char *name, smx_host_t host,
-                                double computation_amount)
+                                double computation_amount,
+                                double priority)
 {
   /* alloc structures and initialize */
   smx_action_t action = xbt_new0(s_smx_action_t, 1);
@@ -198,6 +199,7 @@ smx_action_t SIMIX_host_execute(const char *name, smx_host_t host,
       surf_workstation_model->extension.workstation.execute(host->host,
          computation_amount);
     surf_workstation_model->action_data_set(action->execution.surf_exec, action);
+    surf_workstation_model->set_priority(action->execution.surf_exec, priority);
   }
 
 #ifdef HAVE_TRACING
@@ -293,7 +295,8 @@ e_smx_state_t SIMIX_host_execution_get_state(smx_action_t action)
 
 void SIMIX_host_execution_set_priority(smx_action_t action, double priority)
 {
-  surf_workstation_model->set_priority(action->execution.surf_exec, priority);
+  if(action->execution.surf_exec)
+    surf_workstation_model->set_priority(action->execution.surf_exec, priority);
 }
 
 void SIMIX_pre_host_execution_wait(smx_req_t req)
@@ -310,6 +313,7 @@ void SIMIX_pre_host_execution_wait(smx_req_t req)
   if (MC_IS_ENABLED){
     action->state = SIMIX_DONE;
     SIMIX_execution_finish(action);
+    return;
   }
 
   /* If the action is already finished then perform the error handling */
@@ -319,12 +323,14 @@ void SIMIX_pre_host_execution_wait(smx_req_t req)
 
 void SIMIX_host_execution_suspend(smx_action_t action)
 {
-  surf_workstation_model->suspend(action->execution.surf_exec);
+  if(action->execution.surf_exec)
+    surf_workstation_model->suspend(action->execution.surf_exec);
 }
 
 void SIMIX_host_execution_resume(smx_action_t action)
 {
-  surf_workstation_model->suspend(action->execution.surf_exec);
+  if(action->execution.surf_exec)
+    surf_workstation_model->suspend(action->execution.surf_exec);
 }
 
 void SIMIX_execution_finish(smx_action_t action)
@@ -365,8 +371,12 @@ void SIMIX_execution_finish(smx_action_t action)
         THROW_IMPOSSIBLE;
     }
     req->issuer->waiting_action = NULL;
+    req->host_execution_wait.result = action->state;
     SIMIX_request_answer(req);
   }
+
+  /* We no longer need it */
+  SIMIX_host_execution_destroy(action);
 }
 
 void SIMIX_post_host_execute(smx_action_t action)
@@ -394,6 +404,7 @@ void SIMIX_post_host_execute(smx_action_t action)
 #ifdef HAVE_TRACING
 void SIMIX_set_category(smx_action_t action, const char *category)
 {
+  if (action->state != SIMIX_RUNNING) return;
   if (action->type == SIMIX_ACTION_EXECUTE){
     surf_workstation_model->set_category(action->execution.surf_exec, category);
   }else if (action->type == SIMIX_ACTION_COMMUNICATE){