X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6c93f11ea33a0bd4ef57467a2e57109a78a395f9..2d930fd4960af33c07d94ddb874f7503bab264f0:/src/surf/workstation.c diff --git a/src/surf/workstation.c b/src/surf/workstation.c index 3b33462cf6..fec50a4d3d 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -10,10 +10,12 @@ #include "surf_private.h" #include "storage_private.h" #include "surf/surf_resource.h" +#include "simgrid/sg_config.h" typedef struct workstation_CLM03 { s_surf_resource_t generic_resource; /* Must remain first to add this to a trace */ void *cpu; + void *net_elm; xbt_dynar_t storage; } s_workstation_CLM03_t, *workstation_CLM03_t; @@ -30,6 +32,7 @@ static void workstation_new(sg_platf_host_cbarg_t host) workstation->generic_resource.name = xbt_strdup(host->id); workstation->cpu = xbt_lib_get_or_null(host_lib, host->id, SURF_CPU_LEVEL); workstation->storage = xbt_lib_get_or_null(storage_lib,host->id,ROUTING_STORAGE_HOST_LEVEL); + workstation->net_elm = xbt_lib_get_or_null(host_lib,host->id,ROUTING_HOST_LEVEL); XBT_DEBUG("Create workstation %s with %ld mounted disks",host->id,xbt_dynar_length(workstation->storage)); xbt_lib_set(host_lib, host->id, SURF_WKS_LEVEL, workstation); } @@ -210,8 +213,8 @@ static surf_action_t ws_communicate(void *workstation_src, workstation_CLM03_t src = (workstation_CLM03_t) workstation_src; workstation_CLM03_t dst = (workstation_CLM03_t) workstation_dst; return surf_network_model->extension.network. - communicate(surf_resource_name(src->cpu), - surf_resource_name(dst->cpu), size, rate); + communicate(src->net_elm, + dst->net_elm, size, rate); } static e_surf_resource_state_t ws_get_state(void *workstation) @@ -237,18 +240,46 @@ static surf_action_t ws_execute_parallel_task(int workstation_nb, void **workstation_list, double *computation_amount, double *communication_amount, - double amount, double rate) -{ + double rate) +{ +#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0) + if ((workstation_nb == 1) + && (cost_or_zero(communication_amount, 0) == 0.0)) + return ws_execute(workstation_list[0], computation_amount[0]); + else if ((workstation_nb == 1) + && (cost_or_zero(computation_amount, 0) == 0.0)) + return ws_communicate(workstation_list[0], workstation_list[0],communication_amount[0], rate); + else if ((workstation_nb == 2) + && (cost_or_zero(computation_amount, 0) == 0.0) + && (cost_or_zero(computation_amount, 1) == 0.0)) { + int i,nb = 0; + double value = 0.0; + + for (i = 0; i < workstation_nb * workstation_nb; i++) { + if (cost_or_zero(communication_amount, i) > 0.0) { + nb++; + value = cost_or_zero(communication_amount, i); + } + } + if (nb == 1) + return ws_communicate(workstation_list[0], workstation_list[1],value, rate); + } +#undef cost_or_zero + THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */ return NULL; } /* returns an array of network_link_CM02_t */ -static xbt_dynar_t ws_get_route(void *src, void *dst) +static xbt_dynar_t ws_get_route(void *workstation_src, void *workstation_dst) { + XBT_DEBUG("ws_get_route"); + workstation_CLM03_t src = (workstation_CLM03_t) workstation_src; + workstation_CLM03_t dst = (workstation_CLM03_t) workstation_dst; return surf_network_model->extension. - network.get_route(surf_resource_name(src), surf_resource_name(dst)); + network.get_route(src->net_elm, + dst->net_elm); } static double ws_get_link_bandwidth(const void *link) @@ -297,44 +328,60 @@ static storage_t find_storage_on_mount_list(void *workstation,const char* storag return st; } -static surf_action_t ws_action_open(void *workstation, const char* storage, const char* path, const char* mode) +static surf_action_t ws_action_open(void *workstation, const char* mount, const char* path, const char* mode) { - storage_t st = find_storage_on_mount_list(workstation, storage); + storage_t st = find_storage_on_mount_list(workstation, mount); XBT_DEBUG("OPEN on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.open(st, path, mode); + return model->extension.storage.open(st, mount, path, mode); } -static surf_action_t ws_action_close(void *workstation, const char* storage, surf_file_t fp) +static surf_action_t ws_action_close(void *workstation, surf_file_t fp) { - storage_t st = find_storage_on_mount_list(workstation, storage); + storage_t st = find_storage_on_mount_list(workstation, fp->storage); XBT_DEBUG("CLOSE on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; return model->extension.storage.close(st, fp); } -static surf_action_t ws_action_read(void *workstation, const char* storage, void* ptr, size_t size, size_t nmemb, surf_file_t stream) +static surf_action_t ws_action_read(void *workstation, void* ptr, size_t size, size_t nmemb, surf_file_t stream) { - storage_t st = find_storage_on_mount_list(workstation, storage); + storage_t st = find_storage_on_mount_list(workstation, stream->storage); XBT_DEBUG("READ on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.read(st, ptr, size, nmemb, stream); + return model->extension.storage.read(st, ptr, (double)size, nmemb, stream); } -static surf_action_t ws_action_write(void *workstation, const char* storage, const void* ptr, size_t size, size_t nmemb, surf_file_t stream) +static surf_action_t ws_action_write(void *workstation, const void* ptr, size_t size, size_t nmemb, surf_file_t stream) { - storage_t st = find_storage_on_mount_list(workstation, storage); + storage_t st = find_storage_on_mount_list(workstation, stream->storage); XBT_DEBUG("WRITE on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; return model->extension.storage.write(st, ptr, size, nmemb, stream); } -static surf_action_t ws_action_stat(void *workstation, const char* storage, int fd, void* buf) +static surf_action_t ws_action_stat(void *workstation, surf_file_t stream) { - storage_t st = find_storage_on_mount_list(workstation, storage); + storage_t st = find_storage_on_mount_list(workstation, stream->storage); XBT_DEBUG("STAT on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.stat(st, fd, buf); + return model->extension.storage.stat(st, stream); +} + +static surf_action_t ws_action_unlink(void *workstation, surf_file_t stream) +{ + storage_t st = find_storage_on_mount_list(workstation, stream->storage); + XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name); + surf_model_t model = st->generic_resource.model; + return model->extension.storage.unlink(st, stream); +} + +static surf_action_t ws_action_ls(void *workstation, const char* mount, const char *path) +{ + XBT_DEBUG("LS on mount '%s' and file '%s'",mount, path); + storage_t st = find_storage_on_mount_list(workstation, mount); + surf_model_t model = st->generic_resource.model; + return model->extension.storage.ls(st, path); } static void surf_workstation_model_init_internal(void) @@ -394,12 +441,14 @@ static void surf_workstation_model_init_internal(void) 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; + surf_workstation_model->extension.workstation.unlink = ws_action_unlink; + surf_workstation_model->extension.workstation.ls = ws_action_ls; } void surf_workstation_model_init_current_default(void) { surf_workstation_model_init_internal(); - xbt_cfg_setdefault_int(_surf_cfg_set, "network/crosstraffic", 1); + xbt_cfg_setdefault_int(_sg_cfg_set, "network/crosstraffic", 1); surf_cpu_model_init_Cas01(); surf_network_model_init_LegrandVelho();