+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
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);
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,
{
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);
}
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 -=
/* 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;
{
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;
{
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;
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);
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;
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);
}
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)
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;
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;
&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);
}