+ surf_model_exit(surf_workstation_model);
+ surf_workstation_model = NULL;
+}
+
+static xbt_dict_t ws_get_properties(const void *ws)
+{
+ return surf_resource_properties(((workstation_CLM03_t) ws)->cpu);
+}
+
+static void surf_workstation_model_init_internal(void)
+{
+ surf_workstation_model = surf_model_init();
+
+ surf_workstation_model->name = "Workstation";
+ surf_workstation_model->action_unref = ws_action_unref;
+ surf_workstation_model->action_cancel = ws_action_cancel;
+ surf_workstation_model->action_state_set = ws_action_state_set;
+
+ surf_workstation_model->model_private->resource_used = ws_resource_used;
+ surf_workstation_model->model_private->share_resources =
+ ws_share_resources;
+ surf_workstation_model->model_private->update_actions_state =
+ ws_update_actions_state;
+ surf_workstation_model->model_private->update_resource_state =
+ ws_update_resource_state;
+ surf_workstation_model->model_private->finalize = ws_finalize;
+
+ surf_workstation_model->suspend = ws_action_suspend;
+ surf_workstation_model->resume = ws_action_resume;
+ surf_workstation_model->is_suspended = ws_action_is_suspended;
+ surf_workstation_model->set_max_duration = ws_action_set_max_duration;
+ surf_workstation_model->set_priority = ws_action_set_priority;
+#ifdef HAVE_TRACING
+ surf_workstation_model->set_category = ws_action_set_category;
+#endif
+ surf_workstation_model->get_remains = ws_action_get_remains;
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ surf_workstation_model->get_latency_limited = ws_get_latency_limited;
+#endif
+
+ surf_workstation_model->extension.workstation.execute = ws_execute;
+ surf_workstation_model->extension.workstation.sleep = ws_action_sleep;
+ surf_workstation_model->extension.workstation.get_state = ws_get_state;
+ surf_workstation_model->extension.workstation.get_speed = ws_get_speed;
+ surf_workstation_model->extension.workstation.get_available_speed =
+ ws_get_available_speed;
+
+ surf_workstation_model->extension.workstation.communicate =
+ ws_communicate;
+ surf_workstation_model->extension.workstation.get_route = ws_get_route;
+ surf_workstation_model->extension.workstation.execute_parallel_task =
+ ws_execute_parallel_task;
+ surf_workstation_model->extension.workstation.get_link_bandwidth =
+ ws_get_link_bandwidth;
+ surf_workstation_model->extension.workstation.get_link_latency =
+ ws_get_link_latency;
+ surf_workstation_model->extension.workstation.link_shared =
+ ws_link_shared;
+ surf_workstation_model->extension.workstation.get_properties =
+ ws_get_properties;
+
+}
+
+/********************************************************************/
+/* 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_model_init_CLM03(const char *filename)
+{
+ surf_workstation_model_init_internal();
+ surf_cpu_model_init_Cas01_im(filename);
+ surf_network_model_init_LegrandVelho(filename);
+ update_model_description(surf_workstation_model_description,
+ "CLM03", surf_workstation_model);
+ xbt_dynar_push(model_list, &surf_workstation_model);
+}
+
+void surf_workstation_model_init_compound(const char *filename)
+{
+
+ xbt_assert0(surf_cpu_model, "No CPU model defined yet!");
+ xbt_assert0(surf_network_model, "No network model defined yet!");
+ surf_workstation_model_init_internal();
+
+ update_model_description(surf_workstation_model_description,
+ "compound", surf_workstation_model);