From 5b97270997b724d6a08b1ebeaf679a583ca00cfc Mon Sep 17 00:00:00 2001 From: alegrand Date: Mon, 29 Nov 2004 17:01:01 +0000 Subject: [PATCH] Failures now taken into account. Need to write clean-up functions, parsing 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 | 5 +++++ src/include/surf/maxmin.h | 7 +++++++ src/surf/cpu.c | 35 +++++++++++++++++++++++++++++------ src/surf/maxmin.c | 31 ++++++++++++++++++++++++++++++- src/surf/surf.c | 24 +++++++++++++++++------- 5 files changed, 88 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index aa8cc5a053..33e163dd08 100644 --- 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 diff --git a/src/include/surf/maxmin.h b/src/include/surf/maxmin.h index e0b072368d..4d4f845953 100644 --- a/src/include/surf/maxmin.h +++ b/src/include/surf/maxmin.h @@ -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, diff --git a/src/surf/cpu.c b/src/surf/cpu.c index 8b42a20b0c..03625353c6 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -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); diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 6cae691c2f..a4c1bbb829 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -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(numcnsts_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) diff --git a/src/surf/surf.c b/src/surf/surf.c index 60cea9caa3..5be1d870d2 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -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); } -- 2.20.1