e_surf_action_state_t state);
void (*action_set_data) (surf_action_t action,
void *data);
+ void (*suspend) (surf_action_t action);
+ void (*resume) (surf_action_t action);
+ int (*is_suspended) (surf_action_t action);
const char *name;
} s_surf_resource_public_t, *surf_resource_public_t;
typedef struct surf_cpu_resource_extension_public {
surf_action_t(*execute) (void *cpu, double size);
surf_action_t(*sleep) (void *cpu, double duration);
- void (*suspend) (surf_action_t action);
- void (*resume) (surf_action_t action);
- int (*is_suspended) (surf_action_t action);
e_surf_cpu_state_t(*get_state) (void *cpu);
} s_surf_cpu_resource_extension_public_t,
*surf_cpu_resource_extension_public_t;
typedef struct surf_network_resource_extension_private
*surf_network_resource_extension_private_t;
typedef struct surf_network_resource_extension_public {
- surf_action_t(*communicate) (void *src, void *dst, double size);
- void (*suspend) (surf_action_t action);
- void (*resume) (surf_action_t action);
- int (*is_suspended) (surf_action_t action);
+ surf_action_t(*communicate) (void *src, void *dst, double size,
+ double max_rate);
} s_surf_network_resource_extension_public_t,
*surf_network_resource_extension_public_t;
typedef struct surf_workstation_resource_extension_public {
surf_action_t(*execute) (void *workstation, double size);
surf_action_t(*sleep) (void *workstation, double duration);
- void (*suspend) (surf_action_t action);
- void (*resume) (surf_action_t action);
- int (*is_suspended) (surf_action_t action);
- e_surf_cpu_state_t(*get_state) (void *workstation);
- surf_action_t(*communicate) (void *workstation_src,
- void *workstation_dst, double size);
+ e_surf_cpu_state_t(*get_state) (void *workstation);
+ surf_action_t(*communicate) (void *workstation_src,
+ void *workstation_dst, double size,
+ double max_rate);
} s_surf_workstation_resource_extension_public_t,
*surf_workstation_resource_extension_public_t;
update_resource_state;
surf_cpu_resource->common_private->finalize = finalize;
+ surf_cpu_resource->common_public->suspend = action_suspend;
+ surf_cpu_resource->common_public->resume = action_resume;
+ surf_cpu_resource->common_public->is_suspended = action_is_suspended;
+
surf_cpu_resource->extension_public->execute = execute;
surf_cpu_resource->extension_public->sleep = action_sleep;
- surf_cpu_resource->extension_public->suspend = action_suspend;
- surf_cpu_resource->extension_public->resume = action_resume;
- surf_cpu_resource->extension_public->is_suspended = action_is_suspended;
surf_cpu_resource->extension_public->get_state = get_state;
while (lmm_get_var_from_cnst(maxmin_system, nw_link->constraint, &var)) {
action = lmm_variable_id(var);
action->lat_current += delta;
- lmm_update_variable_bound(maxmin_system, var,
- 1 / (action->lat_current));
+ if(action->rate<0)
+ lmm_update_variable_bound(maxmin_system, action->variable,
+ SG_TCP_CTE_GAMMA / action->lat_current);
+ else
+ lmm_update_variable_bound(maxmin_system, action->variable,
+ min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current));
}
} else if (event_type == nw_link->state_event) {
if (value > 0)
return;
}
-static surf_action_t communicate(void *src, void *dst, double size)
+static surf_action_t communicate(void *src, void *dst, double size, double rate)
{
surf_action_network_t action = NULL;
network_card_t card_src = src;
surf_network_resource->common_public->states.running_action_set;
xbt_swag_insert(action, action->generic_action.state_set);
+ action->rate = rate;
action->latency = 0.0;
for (i = 0; i < route_size; i++)
action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0,
route_size);
- lmm_update_variable_bound(maxmin_system, action->variable,
- SG_TCP_CTE_GAMMA / action->lat_current);
+ if(action->rate<0)
+ lmm_update_variable_bound(maxmin_system, action->variable,
+ SG_TCP_CTE_GAMMA / action->lat_current);
+ else
+ lmm_update_variable_bound(maxmin_system, action->variable,
+ min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current));
for (i = 0; i < route_size; i++)
lmm_expand(maxmin_system, route[i]->constraint, action->variable, 1.0);
update_resource_state;
surf_network_resource->common_private->finalize = finalize;
+ surf_network_resource->common_public->suspend = action_suspend;
+ surf_network_resource->common_public->resume = action_resume;
+ surf_network_resource->common_public->is_suspended = action_is_suspended;
+
surf_network_resource->extension_public->communicate = communicate;
- surf_network_resource->extension_public->suspend = action_suspend;
- surf_network_resource->extension_public->resume = action_resume;
- surf_network_resource->extension_public->is_suspended = action_is_suspended;
network_link_set = xbt_dict_new();
network_card_set = xbt_dict_new();
double latency;
double lat_current;
lmm_variable_t variable;
+ double rate;
int suspended;
network_card_t src;
network_card_t dst;
static void action_suspend(surf_action_t action)
{
if(action->resource_type==(surf_resource_t)surf_network_resource)
- surf_network_resource->extension_public->suspend(action);
+ surf_network_resource->common_public->suspend(action);
else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- surf_cpu_resource->extension_public->suspend(action);
+ surf_cpu_resource->common_public->suspend(action);
else DIE_IMPOSSIBLE;
}
static void action_resume(surf_action_t action)
{
if(action->resource_type==(surf_resource_t)surf_network_resource)
- surf_network_resource->extension_public->resume(action);
+ surf_network_resource->common_public->resume(action);
else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- surf_cpu_resource->extension_public->resume(action);
+ surf_cpu_resource->common_public->resume(action);
else DIE_IMPOSSIBLE;
}
static int action_is_suspended(surf_action_t action)
{
if(action->resource_type==(surf_resource_t)surf_network_resource)
- return surf_network_resource->extension_public->is_suspended(action);
+ return surf_network_resource->common_public->is_suspended(action);
if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- return surf_cpu_resource->extension_public->is_suspended(action);
+ return surf_cpu_resource->common_public->is_suspended(action);
DIE_IMPOSSIBLE;
}
static surf_action_t communicate(void *workstation_src,
- void *workstation_dst, double size)
+ void *workstation_dst, double size,
+ double rate)
{
return surf_network_resource->extension_public->
communicate(((workstation_t) workstation_src)->network_card,
- ((workstation_t) workstation_dst)->network_card, size);
+ ((workstation_t) workstation_dst)->network_card, size, rate);
}
static e_surf_cpu_state_t get_state(void *workstation)
update_resource_state;
surf_workstation_resource->common_private->finalize = finalize;
+ surf_workstation_resource->common_public->suspend = action_suspend;
+ surf_workstation_resource->common_public->resume = action_resume;
+ surf_workstation_resource->common_public->is_suspended = action_is_suspended;
+
surf_workstation_resource->extension_public->execute = execute;
surf_workstation_resource->extension_public->sleep = action_sleep;
- surf_workstation_resource->extension_public->suspend = action_suspend;
- surf_workstation_resource->extension_public->resume = action_resume;
- surf_workstation_resource->extension_public->is_suspended = action_is_suspended;
surf_workstation_resource->extension_public->get_state = get_state;
surf_workstation_resource->extension_public->communicate = communicate;
return;
}
-static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size)
+static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size,
+ double rate)
{
surf_action_network_KCCFLN05_t action = NULL;
workstation_KCCFLN05_t card_src = src;
xbt_swag_insert(action, action->generic_action.state_set);
- action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, -1.0,
- route->size);
+ if(rate>0)
+ action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, rate,
+ route->size);
+ else
+ action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, -1.0,
+ route->size);
for (i = 0; i < route->size; i++)
lmm_expand(maxmin_system_network_KCCFLN05, route->links[i]->constraint,
return (surf_action_t) action;
}
+static void network_KCCFLN05_action_suspend(surf_action_t action)
+{
+ lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
+ ((surf_action_network_KCCFLN05_t) action)->variable, 0.0);
+}
+
+static void network_KCCFLN05_action_resume(surf_action_t action)
+{
+ lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
+ ((surf_action_network_KCCFLN05_t) action)->variable, 1.0);
+}
+
+static int network_KCCFLN05_action_is_suspended(surf_action_t action)
+{
+ return (lmm_get_variable_weight(((surf_action_network_KCCFLN05_t) action)->variable) == 0.0);
+}
+
/***************** CPU ****************/
static void action_cpu_KCCFLN05_free(surf_action_t action)
{
static void cpu_KCCFLN05_action_suspend(surf_action_t action)
{
- if(action->resource_type==(surf_resource_t)surf_network_resource)
- lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
- ((surf_action_network_KCCFLN05_t) action)->variable, 0.0);
- else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
- ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0);
- else DIE_IMPOSSIBLE;
+ lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
+ ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0);
}
static void cpu_KCCFLN05_action_resume(surf_action_t action)
{
- if(action->resource_type==(surf_resource_t)surf_network_resource)
- lmm_update_variable_weight(maxmin_system_network_KCCFLN05,
- ((surf_action_network_KCCFLN05_t) action)->variable, 1.0);
- else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
- ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0);
- else DIE_IMPOSSIBLE;
+ lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
+ ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0);
}
static int cpu_KCCFLN05_action_is_suspended(surf_action_t action)
{
- if(action->resource_type==(surf_resource_t)surf_network_resource)
- return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0);
- if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- return (lmm_get_variable_weight(((surf_action_network_KCCFLN05_t) action)->variable) == 0.0);
- DIE_IMPOSSIBLE;
+ return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0);
}
/************* workstation ************/
static void action_suspend(surf_action_t action)
{
- xbt_assert0(action->resource_type ==
- ((surf_resource_t) surf_cpu_resource),
- "Resource type mismatch");
- surf_cpu_resource->extension_public->suspend(action);
+ if(action->resource_type==(surf_resource_t)surf_network_resource)
+ surf_network_resource->common_public->suspend(action);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->common_public->suspend(action);
+ else DIE_IMPOSSIBLE;
}
static void action_resume(surf_action_t action)
{
- xbt_assert0(action->resource_type ==
- ((surf_resource_t) surf_cpu_resource),
- "Resource type mismatch");
- surf_cpu_resource->extension_public->resume(action);
+ if(action->resource_type==(surf_resource_t)surf_network_resource)
+ surf_network_resource->common_public->resume(action);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->common_public->resume(action);
+ else DIE_IMPOSSIBLE;
}
static int action_is_suspended(surf_action_t action)
{
if(action->resource_type==(surf_resource_t)surf_network_resource)
- return 0;
+ return surf_network_resource->common_public->is_suspended(action);
if(action->resource_type==(surf_resource_t)surf_cpu_resource)
- return surf_cpu_resource->extension_public->is_suspended(action);
+ return surf_cpu_resource->common_public->is_suspended(action);
DIE_IMPOSSIBLE;
}
-
/**************************************/
/********* Module creation ***********/
/**************************************/
surf_cpu_resource->extension_public->execute = execute_KCCFLN05;
/*FIXME*//* surf_cpu_resource->extension_public->sleep = action_sleep; */
- surf_cpu_resource->extension_public->suspend = cpu_KCCFLN05_action_suspend;
- surf_cpu_resource->extension_public->resume = cpu_KCCFLN05_action_resume;
- surf_cpu_resource->extension_public->is_suspended = cpu_KCCFLN05_action_is_suspended;
+
+ surf_cpu_resource->common_public->suspend = cpu_KCCFLN05_action_suspend;
+ surf_cpu_resource->common_public->resume = cpu_KCCFLN05_action_resume;
+ surf_cpu_resource->common_public->is_suspended = cpu_KCCFLN05_action_is_suspended;
surf_cpu_resource->extension_public->get_state = get_state;
update_network_KCCFLN05_state;
surf_network_resource->common_private->finalize = network_KCCFLN05_finalize;
- surf_network_resource->extension_public->communicate = communicate_KCCFLN05;
+ surf_network_resource->common_public->suspend = network_KCCFLN05_action_suspend;
+ surf_network_resource->common_public->resume = network_KCCFLN05_action_resume;
+ surf_network_resource->common_public->is_suspended = network_KCCFLN05_action_is_suspended;
+
+ surf_network_resource->extension_public->communicate = communicate_KCCFLN05;
network_link_set = xbt_dict_new();
surf_workstation_resource->common_private->update_resource_state = update_resource_state;
surf_workstation_resource->common_private->finalize = workstation_KCCFLN05_finalize;
+
+ surf_workstation_resource->common_public->suspend = action_suspend;
+ surf_workstation_resource->common_public->resume = action_resume;
+ surf_workstation_resource->common_public->is_suspended = action_is_suspended;
+
surf_workstation_resource->extension_public->execute = execute_KCCFLN05;
/*FIXME*//* surf_workstation_resource->extension_public->sleep = action_sleep; */
- surf_workstation_resource->extension_public->suspend = action_suspend;
- surf_workstation_resource->extension_public->resume = action_resume;
- surf_workstation_resource->extension_public->is_suspended = action_is_suspended;
surf_workstation_resource->extension_public->get_state = get_state;
surf_workstation_resource->extension_public->communicate = communicate_KCCFLN05;
}