*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);
} s_surf_network_resource_extension_public_t,
*surf_network_resource_extension_public_t;
deltap -= action->latency;
action->latency = 0.0;
}
- if (action->latency == 0.0)
+ if ((action->latency == 0.0) && !(action->suspended))
lmm_update_variable_weight(maxmin_system, action->variable, 1.0);
}
action->generic_action.remains -=
return (surf_action_t) action;
}
+static void action_suspend(surf_action_t action)
+{
+ ((surf_action_network_t) action)->suspended = 1;
+ lmm_update_variable_weight(maxmin_system,
+ ((surf_action_network_t) action)->variable, 0.0);
+}
+
+static void action_resume(surf_action_t action)
+{
+ lmm_update_variable_weight(maxmin_system,
+ ((surf_action_network_t) action)->variable, 1.0);
+ ((surf_action_network_t) action)->suspended = 0;
+}
+
+static int action_is_suspended(surf_action_t action)
+{
+ return ((surf_action_network_t) action)->suspended;
+}
+
static void finalize(void)
{
int i,j;
surf_network_resource->common_private->finalize = finalize;
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;
+ int suspended;
network_card_t src;
network_card_t dst;
} s_surf_action_network_t, *surf_action_network_t;
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->extension_public->suspend(action);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->extension_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->extension_public->resume(action);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->extension_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->extension_public->is_suspended(action);
if(action->resource_type==(surf_resource_t)surf_cpu_resource)
return surf_cpu_resource->extension_public->is_suspended(action);
DIE_IMPOSSIBLE;
static void cpu_KCCFLN05_action_suspend(surf_action_t action)
{
- lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
- ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0);
+ 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;
}
static void cpu_KCCFLN05_action_resume(surf_action_t action)
{
- lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05,
- ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0);
+ 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;
}
static int cpu_KCCFLN05_action_is_suspended(surf_action_t action)
{
- return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0);
+ 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;
}
/************* workstation ************/