Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
At least. ignore ignorable
[simgrid.git] / src / surf / cpu.c
index facbf7e..3814631 100644 (file)
@@ -14,10 +14,12 @@ surf_cpu_model_t surf_cpu_model = NULL;
 lmm_system_t cpu_maxmin_system = NULL;
 
 xbt_dict_t cpu_set = NULL;
+static xbt_swag_t running_action_set_that_does_not_need_being_checked = NULL;
 
 static void cpu_free(void *cpu)
 {
   free(((cpu_Cas01_t) cpu)->name);
+  xbt_dict_free(&(((cpu_Cas01_t)cpu)->properties));
   free(cpu);
 }
 
@@ -124,9 +126,6 @@ static void define_callbacks(const char *file)
 {
   surf_parse_reset_parser();
   surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_init);
-  surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties);
-  surfxml_add_callback(STag_surfxml_random_cb_list, &init_randomness);
-  surfxml_add_callback(ETag_surfxml_random_cb_list, &add_randomness);
 }
 
 static void *name_service(const char *name)
@@ -147,8 +146,8 @@ static int resource_used(void *resource_id)
 
 static int action_free(surf_action_t action)
 {
-  action->using--;
-  if (!action->using) {
+  action->refcount --;
+  if (!action->refcount ) {
     xbt_swag_remove(action, action->state_set);
     if (((surf_action_cpu_Cas01_t) action)->variable)
       lmm_variable_free(cpu_maxmin_system,
@@ -161,7 +160,7 @@ static int action_free(surf_action_t action)
 
 static void action_use(surf_action_t action)
 {
-  action->using++;
+  action->refcount ++;
 }
 
 static void action_cancel(surf_action_t action)
@@ -209,12 +208,6 @@ static void update_actions_state(double now, double delta)
    */
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
-    if (action->generic_action.max_duration == NO_MAX_DURATION &&
-       action->suspended==2 )
-      /* Rely on the fact that sleep action with no duration are on
-        the end of the queue */
-      break;
-
     double_update(&(action->generic_action.remains),
                  lmm_variable_getvalue(action->variable) * delta);
     if (action->generic_action.max_duration != NO_MAX_DURATION)
@@ -257,7 +250,8 @@ static void update_resource_state(void *id,
        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) {
+          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);
        }
@@ -279,7 +273,7 @@ static surf_action_t execute(void *cpu, double size)
   XBT_IN2("(%s,%g)", CPU->name, size);
   action = xbt_new0(s_surf_action_cpu_Cas01_t, 1);
 
-  action->generic_action.using = 1;
+  action->generic_action.refcount  = 1;
   action->generic_action.cost = size;
   action->generic_action.remains = size;
   action->generic_action.priority = 1.0;
@@ -297,9 +291,8 @@ static surf_action_t execute(void *cpu, double size)
   else
     action->generic_action.state_set =
        surf_cpu_model->common_public->states.failed_action_set;
-  /* Insert at the head by default. This convention is used to speed
-     up update_resource_state  */
-  xbt_swag_insert_at_head(action, action->generic_action.state_set);
+
+  xbt_swag_insert(action, action->generic_action.state_set);
 
   action->variable = lmm_variable_new(cpu_maxmin_system, action,
                                      action->generic_action.priority,
@@ -312,7 +305,7 @@ 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;
-  xbt_swag_t action_set = NULL;
+
   if (duration>0)
      duration=MAX(duration,MAXMIN_PRECISION);
 
@@ -323,9 +316,9 @@ static surf_action_t action_sleep(void *cpu, double duration)
   if(duration == NO_MAX_DURATION) {
     /* Move to the *end* of the corresponding action set. This convention
        is used to speed up update_resource_state  */
-    action_set = action->generic_action.state_set;
-    xbt_swag_remove(action, action_set);
-    xbt_swag_insert(action, action_set);
+    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);
@@ -402,12 +395,16 @@ static xbt_dict_t get_properties(void *cpu)
 static void finalize(void)
 {
   xbt_dict_free(&cpu_set);
+  lmm_system_free(cpu_maxmin_system);
+  cpu_maxmin_system = NULL;
   xbt_swag_free(surf_cpu_model->common_public->states.ready_action_set);
   xbt_swag_free(surf_cpu_model->common_public->states.
                running_action_set);
   xbt_swag_free(surf_cpu_model->common_public->states.
                failed_action_set);
   xbt_swag_free(surf_cpu_model->common_public->states.done_action_set);
+  xbt_swag_free(running_action_set_that_does_not_need_being_checked);
+  running_action_set_that_does_not_need_being_checked = NULL;
   free(surf_cpu_model->common_public);
   free(surf_cpu_model->common_private);
   free(surf_cpu_model->extension_public);
@@ -438,6 +435,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 =