surf_workstation_resource_t surf_workstation_resource = NULL;
-static xbt_dict_t workstation_set = NULL;
+xbt_dict_t workstation_set = NULL;
static workstation_t workstation_new(const char *name,
void *cpu, void *card)
return workstation;
}
+static void workstation_free(void *workstation)
+{
+ xbt_free(((workstation_t)workstation)->name);
+ xbt_free(workstation);
+}
+
static void create_workstations(void)
{
xbt_dict_cursor_t cursor = NULL;
xbt_dict_get(network_card_set, name, (void *) &nw_card);
xbt_assert0(nw_card, "No corresponding card found");
xbt_dict_set(workstation_set, name,
- workstation_new(name, cpu, nw_card), NULL);
+ workstation_new(name, cpu, nw_card), workstation_free);
}
}
static void action_free(surf_action_t action)
{
+ if(action->resource_type==(surf_resource_t)surf_network_resource)
+ surf_network_resource->common_public->action_free(action);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->common_public->action_free(action);
+ else DIE_IMPOSSIBLE;
return;
}
static void action_change_state(surf_action_t action,
e_surf_action_state_t state)
{
- surf_action_change_state(action, state);
+ if(action->resource_type==(surf_resource_t)surf_network_resource)
+ surf_network_resource->common_public->action_change_state(action,state);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->common_public->action_change_state(action,state);
+ else DIE_IMPOSSIBLE;
return;
}
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 surf_network_resource->common_public->is_suspended(action);
+ if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ 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)
static void finalize(void)
{
+ xbt_dict_free(&workstation_set);
+ xbt_swag_free(surf_workstation_resource->common_public->states.ready_action_set);
+ xbt_swag_free(surf_workstation_resource->common_public->states.
+ running_action_set);
+ xbt_swag_free(surf_workstation_resource->common_public->states.
+ failed_action_set);
+ xbt_swag_free(surf_workstation_resource->common_public->states.done_action_set);
+
+ xbt_free(surf_workstation_resource->common_public);
+ xbt_free(surf_workstation_resource->common_private);
+ xbt_free(surf_workstation_resource->extension_public);
+
+ xbt_free(surf_workstation_resource);
+ surf_workstation_resource = NULL;
}
static void surf_workstation_resource_init_internal(void)
action_recycle;
surf_workstation_resource->common_public->action_change_state =
action_change_state;
+ surf_workstation_resource->common_public->action_set_data = surf_action_set_data;
surf_workstation_resource->common_public->name = "Workstation";
surf_workstation_resource->common_private->resource_used = resource_used;
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->get_state = get_state;
surf_workstation_resource->extension_public->communicate = communicate;
xbt_assert0(maxmin_system, "surf_init has to be called first!");
}
-void surf_workstation_resource_init(const char *filename)
+/********************************************************************/
+/* The model used in MSG and presented at CCGrid03 */
+/********************************************************************/
+/* @InProceedings{Casanova.CLM_03, */
+/* author = {Henri Casanova and Arnaud Legrand and Loris Marchal}, */
+/* title = {Scheduling Distributed Applications: the SimGrid Simulation Framework}, */
+/* booktitle = {Proceedings of the third IEEE International Symposium on Cluster Computing and the Grid (CCGrid'03)}, */
+/* publisher = {"IEEE Computer Society Press"}, */
+/* month = {may}, */
+/* year = {2003} */
+/* } */
+void surf_workstation_resource_init_CLM03(const char *filename)
{
/* int i ; */
/* surf_resource_t resource = NULL; */
surf_workstation_resource_init_internal();
- surf_cpu_resource_init(filename);
- surf_network_resource_init(filename);
+ surf_cpu_resource_init_Cas01(filename);
+ surf_network_resource_init_CM02(filename);
create_workstations();
xbt_dynar_push(resource_list, &surf_workstation_resource);
/* xbt_dynar_foreach(resource_list, i, resource) { */