typedef struct workstation_CLM03 {
s_surf_resource_t generic_resource; /* Must remain first to add this to a trace */
void *cpu;
+ void *storage;
} s_workstation_CLM03_t, *workstation_CLM03_t;
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf,
surf_model_t surf_workstation_model = NULL;
-static workstation_CLM03_t workstation_new(const char *name, void *cpu)
+static workstation_CLM03_t workstation_new(const char *name, void *cpu, void *storage)
{
workstation_CLM03_t workstation = xbt_new0(s_workstation_CLM03_t, 1);
workstation->generic_resource.model = surf_workstation_model;
workstation->generic_resource.name = xbt_strdup(name);
workstation->cpu = cpu;
+ workstation->storage = storage;
xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, workstation);
xbt_lib_cursor_t cursor = NULL;
char *name = NULL;
void **cpu = NULL;
-
+ void *storage = NULL;
xbt_lib_foreach(host_lib, cursor, name, cpu) {
if(cpu[SURF_CPU_LEVEL])
- workstation_new(name, cpu[SURF_CPU_LEVEL]);
+ // Need to find storage attached to workstation
+ workstation_new(name, cpu[SURF_CPU_LEVEL],storage);
}
}
static int ws_resource_used(void *resource_id)
{
THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */
+ return -1;
}
static void ws_parallel_action_cancel(surf_action_t action)
static int ws_parallel_action_free(surf_action_t action)
{
THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */
+ return -1;
}
static int ws_action_unref(surf_action_t action)
static surf_action_t ws_execute(void *workstation, double size)
{
- return surf_cpu_model->extension.cpu.
- execute(((workstation_CLM03_t) workstation)->cpu, size);
+ void *cpu = ((workstation_CLM03_t) workstation)->cpu;
+ return ((surf_resource_t) cpu)->model->extension.cpu.execute(cpu, size);
}
static surf_action_t ws_action_sleep(void *workstation, double duration)
if (action->model_type == surf_cpu_model)
return surf_cpu_model->is_suspended(action);
DIE_IMPOSSIBLE;
+ return -1;
}
static void ws_action_set_max_duration(surf_action_t action,
if (action->model_type == surf_cpu_model)
return surf_cpu_model->get_remains(action);
DIE_IMPOSSIBLE;
+ return -1.0;
}
static surf_action_t ws_communicate(void *workstation_src,
double amount, double rate)
{
THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */
+ return NULL;
}
static xbt_dynar_t ws_get_route(void *src, void *dst)
{
return surf_network_model->extension.
- network.get_route(surf_resource_name(src), surf_resource_name(src));
+ network.get_route(surf_resource_name(src), surf_resource_name(dst));
}
static double ws_get_link_bandwidth(const void *link)
static int ws_link_shared(const void *link)
{
- return surf_network_model->extension.network.get_link_latency(link);
+ return surf_network_model->extension.network.link_shared(link);
}
static void ws_finalize(void)
return surf_resource_properties(((workstation_CLM03_t) ws)->cpu);
}
+static surf_action_t ws_action_open(void *workstation, const char* path, const char* mode)
+{
+ void *storage = ((workstation_CLM03_t) workstation)->storage;
+ return ((surf_resource_t) storage)->model->extension.storage.open(storage, path, mode);
+}
+
+static surf_action_t ws_action_close(void *workstation, surf_file_t fp)
+{
+ void *storage = ((workstation_CLM03_t) workstation)->storage;
+ return ((surf_resource_t) storage)->model->extension.storage.close(storage, fp);
+}
+
+static surf_action_t ws_action_read(void *workstation, void* ptr, size_t size, size_t nmemb, surf_file_t stream)
+{
+ void *storage = ((workstation_CLM03_t) workstation)->storage;
+ return ((surf_resource_t) storage)->model->extension.storage.read(storage, ptr, size, nmemb, stream);
+}
+
+static surf_action_t ws_action_write(void *workstation, const void* ptr, size_t size, size_t nmemb, surf_file_t stream)
+{
+ void *storage = ((workstation_CLM03_t) workstation)->storage;
+ return ((surf_resource_t) storage)->model->extension.storage.write(storage, ptr, size, nmemb, stream);
+}
+
+static surf_action_t ws_action_stat(void *workstation, int fd, void* buf)
+{
+ void *storage = ((workstation_CLM03_t) workstation)->storage;
+ return ((surf_resource_t) storage)->model->extension.storage.stat(storage, fd, buf);
+}
+
static void surf_workstation_model_init_internal(void)
{
surf_workstation_model = surf_model_init();
surf_workstation_model->extension.workstation.get_properties =
ws_get_properties;
+ surf_workstation_model->extension.workstation.open = ws_action_open;
+ surf_workstation_model->extension.workstation.close = ws_action_close;
+ surf_workstation_model->extension.workstation.read = ws_action_read;
+ surf_workstation_model->extension.workstation.write = ws_action_write;
+ surf_workstation_model->extension.workstation.stat = ws_action_stat;
}
-/********************************************************************/
-/* 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(void)
+void surf_workstation_model_init_current_default(void)
{
surf_workstation_model_init_internal();
- surf_cpu_model_init_Cas01_im();
+ xbt_cfg_setdefault_int(_surf_cfg_set, "network/crosstraffic", 1);
+ surf_cpu_model_init_Cas01();
surf_network_model_init_LegrandVelho();
+
xbt_dynar_push(model_list, &surf_workstation_model);
+ sg_platf_postparse_add_cb(create_workstations);
}
void surf_workstation_model_init_compound()
xbt_assert(surf_network_model, "No network model defined yet!");
surf_workstation_model_init_internal();
xbt_dynar_push(model_list, &surf_workstation_model);
+ sg_platf_postparse_add_cb(create_workstations);
}