Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Failures now taken into account. Need to write clean-up functions, parsing
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 29 Nov 2004 17:01:01 +0000 (17:01 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 29 Nov 2004 17:01:01 +0000 (17:01 +0000)
functions, ..., then the network module.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@526 48e7efb5-ca39-0410-a469-dd3cf9ba447f

ChangeLog
src/include/surf/maxmin.h
src/surf/cpu.c
src/surf/maxmin.c
src/surf/surf.c

index aa8cc5a..33e163d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-11-28 Arnaud
+  - Main loop and datastructures of SURF. A cpu resource object is
+    functionnal. Surf can thus be used to create cpu's with variable
+    performance on which you can execute some actions.
+       
 2004-11-15 Martin Quinson
   - Port to ARM. Simply added the alignment and size descriptions. Should
     work, but the ARM machines are so slow that I didn't had the opportunity
index e0b0723..4d4f845 100644 (file)
@@ -15,6 +15,7 @@ typedef struct lmm_system *lmm_system_t;
 
 lmm_system_t lmm_system_new(void);
 void lmm_system_free(lmm_system_t sys);
+void lmm_variable_disable(lmm_system_t sys, lmm_variable_t var);
 
 lmm_constraint_t lmm_constraint_new(lmm_system_t sys, void *id,
                                    xbt_maxmin_float_t bound_value);
@@ -31,6 +32,12 @@ xbt_maxmin_float_t lmm_variable_getvalue(lmm_variable_t var);
 void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
                lmm_variable_t var, xbt_maxmin_float_t value);
 
+lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys, lmm_variable_t var, int num);
+int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var);
+
+void *lmm_constraint_id(lmm_constraint_t cnst);
+void *lmm_variable_id(lmm_variable_t var);
+
 void lmm_update(lmm_system_t sys, lmm_constraint_t cnst,
                lmm_variable_t var, xbt_maxmin_float_t value);
 void lmm_update_variable_bound(lmm_variable_t var,
index 8b42a20..0362535 100644 (file)
@@ -48,8 +48,9 @@ static void parse_file(const char *file)
 {
   tmgr_trace_t trace_A = tmgr_trace_new("trace_A.txt");
   tmgr_trace_t trace_B = tmgr_trace_new("trace_B.txt");
+  tmgr_trace_t trace_A_failure = tmgr_trace_new("trace_A_failure.txt");
 
-  new_cpu("Cpu A", 20.0, 1.0, trace_A, SURF_CPU_ON, NULL);
+  new_cpu("Cpu A", 100.0, 1.0, trace_A, SURF_CPU_ON, trace_A_failure);
   new_cpu("Cpu B", 100.0, 1.0, trace_B, SURF_CPU_ON, NULL);
 }
 
@@ -131,6 +132,7 @@ static void update_actions_state(xbt_heap_float_t now,
   surf_action_cpu_t action = NULL;
   surf_action_cpu_t next_action = NULL;
   xbt_swag_t running_actions= surf_cpu_resource->common_public->states.running_action_set;
+  xbt_swag_t failed_actions= surf_cpu_resource->common_public->states.failed_action_set;
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
     action->generic_action.remains -= 
@@ -138,7 +140,24 @@ static void update_actions_state(xbt_heap_float_t now,
 /*     if(action->generic_action.remains<.00001) action->generic_action.remains=0; */
     if(action->generic_action.remains<=0) {
       action_change_state((surf_action_t)action, SURF_ACTION_DONE);
-    } /* else if(host_failed..) */
+    } else { /* Need to check that none of the resource has failed*/
+      lmm_constraint_t cnst = NULL;
+      int tab_size =  lmm_get_number_of_cnst_from_var(sys, action->variable);
+      int i=0;
+      cpu_t cpu = NULL;
+
+      while((cnst=lmm_get_cnst_from_var(sys, action->variable, i++))) {
+       cpu = lmm_constraint_id(cnst);
+       if(cpu->current_state==SURF_CPU_OFF) {
+         action_change_state((surf_action_t) action, SURF_ACTION_FAILED);
+         break;
+       }
+      }
+    }
+  }
+
+  xbt_swag_foreach_safe(action, next_action, failed_actions) {
+    lmm_variable_disable(sys, action->variable);
   }
 
   return;
@@ -150,8 +169,8 @@ static void update_resource_state(void *id,
 {
   cpu_t cpu = id;
   
-  printf("Asking to update \"%s\" with value " XBT_MAXMIN_FLOAT_T " for event %p\n",
-        cpu->name, value, event_type);
+  printf("[" XBT_HEAP_FLOAT_T "] Asking to update \"%s\" with value " XBT_MAXMIN_FLOAT_T " for event %p\n",
+        surf_get_clock(), cpu->name, value, event_type);
   
   if(event_type==cpu->power_event) {
     cpu->current_power = value;
@@ -168,7 +187,8 @@ static surf_action_t execute(void *cpu, xbt_maxmin_float_t size)
 {
   lmm_variable_t var;
   surf_action_cpu_t action = NULL;
-
+  cpu_t CPU = cpu;
+  
   action=xbt_new0(s_surf_action_cpu_t,1);
 
   action->generic_action.cost=size;
@@ -178,7 +198,10 @@ static surf_action_t execute(void *cpu, xbt_maxmin_float_t size)
   action->generic_action.callback=cpu;
   action->generic_action.resource_type=(surf_resource_t)surf_cpu_resource;
 
-  action->generic_action.state_set=surf_cpu_resource->common_public->states.running_action_set;
+  if(CPU->current_state==SURF_CPU_ON) 
+    action->generic_action.state_set=surf_cpu_resource->common_public->states.running_action_set;
+  else 
+    action->generic_action.state_set=surf_cpu_resource->common_public->states.failed_action_set;
   xbt_swag_insert(action,action->generic_action.state_set);
 
   action->variable = lmm_variable_new(sys, action, 1.0, -1.0, 1);
index 6cae691..a4c1bbb 100644 (file)
@@ -57,7 +57,7 @@ void lmm_system_free(lmm_system_t sys)
   xbt_free(sys);
 }
 
-static void lmm_var_free(lmm_system_t sys, lmm_variable_t var)
+void lmm_variable_disable(lmm_system_t sys, lmm_variable_t var)
 {
   int i;
   lmm_element_t elem = NULL;
@@ -68,6 +68,14 @@ static void lmm_var_free(lmm_system_t sys, lmm_variable_t var)
     if (xbt_swag_size(&(elem->constraint->element_set)))
       make_constraint_inactive(sys, elem->constraint);
   }
+  var->cnsts_number = 0;
+}
+
+static void lmm_var_free(lmm_system_t sys, lmm_variable_t var)
+{
+
+  lmm_variable_disable(sys, var);
+
   xbt_free(var->cnsts);
   xbt_free(var);
 }
@@ -156,6 +164,27 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
   make_constraint_active(sys, cnst);
 }
 
+lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys, lmm_variable_t var, int num)
+{
+  if(num<var->cnsts_number) return(var->cnsts[num].constraint);
+  else return NULL;
+}
+
+int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var)
+{
+  return(var->cnsts_number);
+}
+
+void *lmm_constraint_id(lmm_constraint_t cnst)
+{
+  return cnst->id;
+}
+
+void *lmm_variable_id(lmm_variable_t var)
+{
+  return var->id;
+}
+
 static void saturated_constraints_update(lmm_system_t sys,
                                         lmm_constraint_t cnst,
                                         xbt_maxmin_float_t * min_usage)
index 60cea9c..5be1d87 100644 (file)
@@ -61,6 +61,8 @@ void surf_init(void)
 
 xbt_heap_float_t surf_solve(void)
 {
+  static int first_run = 1;
+
   xbt_heap_float_t min = -1.0;
   xbt_heap_float_t next_event_date = -1.0;
   xbt_heap_float_t resource_next_action_end = -1.0;
@@ -70,13 +72,20 @@ xbt_heap_float_t surf_solve(void)
   tmgr_trace_event_t event = NULL;
   int i;
 
-  while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
-    if(next_event_date > NOW) break;
-    while ((event = tmgr_history_get_next_event_leq(history, next_event_date,
-                                          &value, (void **) &resource_obj))) {
-      resource_obj->resource->common_private->update_resource_state(resource_obj,
-                                                                   event, value);
+  if(first_run) {
+    while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
+      if(next_event_date > NOW) break;
+      while ((event = tmgr_history_get_next_event_leq(history, next_event_date,
+                                                     &value, (void **) &resource_obj))) {
+       resource_obj->resource->common_private->update_resource_state(resource_obj,
+                                                                     event, value);
+      }
+    }
+    xbt_dynar_foreach (resource_list,i,resource) {
+      resource->common_private->update_actions_state(NOW, 0.0);
     }
+    first_run = 0;
+    return 0.0;
   }
 
   min = -1.0;
@@ -93,8 +102,9 @@ xbt_heap_float_t surf_solve(void)
                                                  &value, (void **) &resource_obj))) {
       if(resource_obj->resource->common_public->resource_used(resource_obj)) {
        min = next_event_date-NOW;
-/*     update_state of resource_obj according to new value */
       }
+      /* update state of resource_obj according to new value. Does not touch lmm.
+         It will be modified if needed when updating actions */
       resource_obj->resource->common_private->update_resource_state(resource_obj,
                                                                    event, value);
     }