Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make GTNETS compatible with new parsing and variable name convention.
[simgrid.git] / src / surf / cpu.c
index ebb3c1e..69aedef 100644 (file)
@@ -14,6 +14,7 @@ surf_cpu_model_t surf_cpu_model = NULL;
 lmm_system_t cpu_maxmin_system = NULL;
 
 xbt_dict_t cpu_set = NULL;
+xbt_swag_t running_action_set_that_does_not_need_being_checked = NULL;
 
 static void cpu_free(void *cpu)
 {
@@ -229,7 +230,7 @@ static void update_actions_state(double now, double delta)
 
 static void update_resource_state(void *id,
                                  tmgr_trace_event_t event_type,
-                                 double value)
+                                 double value, double date)
 {
   cpu_Cas01_t cpu = id;
 
@@ -247,12 +248,13 @@ static void update_resource_state(void *id,
 
       cpu->state_current = SURF_CPU_OFF;
 
-      while(var = lmm_get_var_from_cnst(cpu_maxmin_system,cnst,&elem)) {
+      while((var = lmm_get_var_from_cnst(cpu_maxmin_system,cnst,&elem))) {
        surf_action_t action = lmm_variable_id(var) ;
 
        if(surf_action_get_state(action)==SURF_ACTION_RUNNING ||
-          surf_action_get_state(action)==SURF_ACTION_READY) {
-         action->finish = surf_get_clock(); // BUG! Wrong value here
+          surf_action_get_state(action)==SURF_ACTION_READY || 
+          surf_action_get_state(action)==SURF_ACTION_NOT_IN_THE_SYSTEM) {
+         action->finish = date;
          action_change_state( action, SURF_ACTION_FAILED);
        }
       }
@@ -291,6 +293,7 @@ static surf_action_t execute(void *cpu, double size)
   else
     action->generic_action.state_set =
        surf_cpu_model->common_public->states.failed_action_set;
+
   xbt_swag_insert(action, action->generic_action.state_set);
 
   action->variable = lmm_variable_new(cpu_maxmin_system, action,
@@ -304,12 +307,21 @@ static surf_action_t execute(void *cpu, double size)
 static surf_action_t action_sleep(void *cpu, double duration)
 {
   surf_action_cpu_Cas01_t action = NULL;
+
   if (duration>0)
      duration=MAX(duration,MAXMIN_PRECISION);
+
   XBT_IN2("(%s,%g)", ((cpu_Cas01_t) cpu)->name, duration);
   action = (surf_action_cpu_Cas01_t) execute(cpu, 1.0);
   action->generic_action.max_duration = duration;
   action->suspended = 2;
+  if(duration == NO_MAX_DURATION) {
+    /* Move to the *end* of the corresponding action set. This convention
+       is used to speed up update_resource_state  */
+    xbt_swag_remove(action, ((surf_action_t)action)->state_set);
+    ((surf_action_t)action)->state_set =running_action_set_that_does_not_need_being_checked;
+    xbt_swag_insert(action, ((surf_action_t)action)->state_set);
+  }
 
   lmm_update_variable_weight(cpu_maxmin_system, action->variable, 0.0);
   XBT_OUT;
@@ -421,6 +433,9 @@ static void surf_cpu_model_init_internal(void)
   surf_cpu_model->common_public->states.done_action_set =
       xbt_swag_new(xbt_swag_offset(action, state_hookup));
 
+  running_action_set_that_does_not_need_being_checked =
+      xbt_swag_new(xbt_swag_offset(action, state_hookup));
+
   surf_cpu_model->common_public->name_service = name_service;
   surf_cpu_model->common_public->get_resource_name = get_resource_name;
   surf_cpu_model->common_public->action_get_state =