Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
At least. ignore ignorable
[simgrid.git] / src / surf / cpu.c
index 5abfc22..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);
 }
 
@@ -88,37 +90,35 @@ static void parse_cpu_init(void)
 
 }
 
-static int called = 0;
+static void add_traces_cpu(void) {
+   xbt_dict_cursor_t cursor=NULL;
+   char *trace_name,*elm;
 
-static void add_traces(void)
-{
-   xbt_dynar_t trace_connect = NULL;
-   unsigned int cpt;
-   int connect_element, connect_kind;
-   char *value, *trace_id, *connector_id;
-   cpu_Cas01_t host = NULL;
-   tmgr_trace_t trace;
+   static int called = 0;
    
    if (called) return;
    called = 1;
 
-   /*for all trace connects parse them and update traces for hosts */
-   xbt_dynar_foreach (traces_connect_list, cpt, value) {
-     trace_connect = xbt_str_split_str(value, "##");
-     trace_id        = xbt_dynar_get_as(trace_connect, 0, char*);
-     connect_element = atoi(xbt_dynar_get_as(trace_connect, 1, char*)); 
-     connect_kind    = atoi(xbt_dynar_get_as(trace_connect, 2, char*));
-     connector_id    = xbt_dynar_get_as(trace_connect, 3, char*);
-
-     xbt_assert1((trace = xbt_dict_get_or_null(traces_set_list, trace_id)), "Trace %s undefined", trace_id);
-
-     if (connect_element == A_surfxml_trace_c_connect_element_HOST) {
-        xbt_assert1((host = xbt_dict_get_or_null(cpu_set, connector_id)), "Host %s undefined", connector_id);
-        switch (connect_kind) {
-           case A_surfxml_trace_c_connect_kind_AVAILABILITY: host->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
-           case A_surfxml_trace_c_connect_kind_POWER: host->power_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
-        }
-     }
+   
+   /* connect all traces relative to hosts */
+   xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+      tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
+      cpu_Cas01_t host = xbt_dict_get_or_null(cpu_set, elm);
+      
+      xbt_assert1(host, "Host %s undefined", elm);
+      xbt_assert1(trace, "Trace %s undefined", trace_name);
+      
+      host->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); 
+   }
+
+   xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+      tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
+      cpu_Cas01_t host = xbt_dict_get_or_null(cpu_set, elm);
+      
+      xbt_assert1(host, "Host %s undefined", elm);
+      xbt_assert1(trace, "Trace %s undefined", trace_name);
+      
+      host->power_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); 
    }
 }
 
@@ -126,10 +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(ETag_surfxml_platform_cb_list, &add_traces);
-  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)
@@ -150,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,
@@ -164,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)
@@ -224,21 +220,6 @@ static void update_actions_state(double now, double delta)
               (action->generic_action.max_duration <= 0)) {
       action->generic_action.finish = surf_get_clock();
       action_change_state((surf_action_t) action, SURF_ACTION_DONE);
-    } else {                   /* Need to check that none of the model has failed */
-      lmm_constraint_t cnst = NULL;
-      int i = 0;
-      cpu_Cas01_t cpu = NULL;
-
-      while ((cnst =
-             lmm_get_cnst_from_var(cpu_maxmin_system, action->variable,
-                                   i++))) {
-       cpu = lmm_constraint_id(cnst);
-       if (cpu->state_current == SURF_CPU_OFF) {
-         action->generic_action.finish = surf_get_clock();
-         action_change_state((surf_action_t) action, SURF_ACTION_FAILED);
-         break;
-       }
-      }
     }
   }
 
@@ -247,7 +228,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;
 
@@ -258,8 +239,24 @@ static void update_resource_state(void *id,
   } else if (event_type == cpu->state_event) {
     if (value > 0)
       cpu->state_current = SURF_CPU_ON;
-    else
+    else {
+      lmm_constraint_t cnst = cpu->constraint;
+      lmm_variable_t var = NULL;
+      lmm_element_t elem = NULL;
+
       cpu->state_current = SURF_CPU_OFF;
+
+      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 || 
+          surf_action_get_state(action)==SURF_ACTION_NOT_IN_THE_SYSTEM) {
+         action->finish = date;
+         action_change_state( action, SURF_ACTION_FAILED);
+       }
+      }
+    }
   } else {
     CRITICAL0("Unknown event ! \n");
     xbt_abort();
@@ -276,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;
@@ -294,6 +291,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,
@@ -308,10 +306,21 @@ 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;
   return (surf_action_t) action;
@@ -386,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);
@@ -422,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 =