X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3196e54e1f004f07f2348d059f351b95146732ef..1d6f35064b982906e6931d6e2cfbf22ab51a10b3:/src/surf/workstation.c diff --git a/src/surf/workstation.c b/src/surf/workstation.c index c23662912b..757e10e1b9 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -5,14 +5,12 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "xbt/ex.h" #include "xbt/dict.h" #include "workstation_private.h" #include "cpu_private.h" #include "network_private.h" -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(workstation, surf, - "Logging specific to the SURF workstation module"); - surf_workstation_resource_t surf_workstation_resource = NULL; xbt_dict_t workstation_set = NULL; @@ -38,15 +36,16 @@ static void workstation_free(void *workstation) static void create_workstations(void) { - xbt_dict_cursor_t cursor = NULL; + xbt_dict_cursor_t cursor = NULL; char *name = NULL; void *cpu = NULL; void *nw_card = NULL; xbt_dict_foreach(cpu_set, cursor, name, cpu) { - nw_card = NULL; - xbt_dict_get(network_card_set, name, (void *) &nw_card); - xbt_assert1(nw_card, "No corresponding card found for %s",name); + nw_card = xbt_dict_get_or_null(network_card_set, name); + xbt_assert1(nw_card, + "No corresponding card found for %s",name); + xbt_dict_set(workstation_set, name, workstation_new(name, cpu, nw_card), workstation_free); } @@ -54,11 +53,7 @@ static void create_workstations(void) static void *name_service(const char *name) { - void *workstation = NULL; - - xbt_dict_get(workstation_set, name, &workstation); - - return workstation; + return xbt_dict_get_or_null(workstation_set, name); } static const char *get_resource_name(void *resource_id) @@ -110,14 +105,20 @@ static void action_use(surf_action_t action) else if(action->resource_type==(surf_resource_t)surf_cpu_resource) surf_cpu_resource->common_public->action_use(action); else if(action->resource_type==(surf_resource_t)surf_workstation_resource) - return parallel_action_use(action); + parallel_action_use(action); else DIE_IMPOSSIBLE; return; } static void action_cancel(surf_action_t action) { - DIE_IMPOSSIBLE; + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->action_cancel(action); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->action_cancel(action); + else if(action->resource_type==(surf_resource_t)surf_workstation_resource) + parallel_action_use(action); + else DIE_IMPOSSIBLE; return; } @@ -142,7 +143,10 @@ static void action_change_state(surf_action_t action, static double share_resources(double now) { - return -1.0; + s_surf_action_parallel_task_CSL05_t action; + return generic_maxmin_share_resources(surf_workstation_resource->common_public-> + states.running_action_set, + xbt_swag_offset(action, variable)); } static void update_actions_state(double now, double delta) @@ -151,8 +155,10 @@ static void update_actions_state(double now, double delta) surf_action_parallel_task_CSL05_t next_action = NULL; xbt_swag_t running_actions = surf_workstation_resource->common_public->states.running_action_set; + /* FIXME: unused xbt_swag_t failed_actions = surf_workstation_resource->common_public->states.failed_action_set; + */ xbt_swag_foreach_safe(action, next_action, running_actions) { surf_double_update(&(action->generic_action.remains), @@ -253,6 +259,15 @@ static void action_set_max_duration(surf_action_t action, double duration) surf_cpu_resource->common_public->set_max_duration(action,duration); else DIE_IMPOSSIBLE; } + +static void action_set_priority(surf_action_t action, double priority) +{ + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->set_priority(action,priority); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->set_priority(action,priority); + else DIE_IMPOSSIBLE; +} static surf_action_t communicate(void *workstation_src, void *workstation_dst, double size, @@ -269,6 +284,12 @@ static e_surf_cpu_state_t get_state(void *workstation) get_state(((workstation_CLM03_t) workstation)->cpu); } +static double get_speed(void *workstation, double load) +{ + return surf_cpu_resource->extension_public-> + get_speed(((workstation_CLM03_t) workstation)->cpu, load); +} + static surf_action_t execute_parallel_task (int workstation_nb, void **workstation_list, double *computation_amount, @@ -282,6 +303,7 @@ static surf_action_t execute_parallel_task (int workstation_nb, xbt_dict_cursor_t cursor = NULL; char *name = NULL; int nb_link = 0; + int nb_host = 0; network_link_CM02_t link; /* Compute the number of affected resources... */ @@ -292,17 +314,25 @@ static surf_action_t execute_parallel_task (int workstation_nb, int route_size = ROUTE_SIZE(card_src->id, card_dst->id); network_link_CM02_t *route = ROUTE(card_src->id, card_dst->id); - if(communication_amount[i*workstation_nb+j]>=0) + if(communication_amount[i*workstation_nb+j]>0) for(k=0; k< route_size; k++) { xbt_dict_set(network_link_set, route[k]->name, route[k], NULL); } } } - + xbt_dict_foreach(network_link_set, cursor, name, link) { nb_link++; } - + + xbt_dict_free(&network_link_set); + + for (i = 0; i0) nb_host++; + + if(nb_link + workstation_nb == 0) + return NULL; + action = xbt_new0(s_surf_action_parallel_task_CSL05_t, 1); action->generic_action.using = 1; action->generic_action.cost = amount; @@ -315,24 +345,22 @@ static surf_action_t execute_parallel_task (int workstation_nb, action->suspended = 0; /* Should be useless because of the calloc but it seems to help valgrind... */ action->generic_action.state_set = - surf_network_resource->common_public->states.running_action_set; + surf_workstation_resource->common_public->states.running_action_set; xbt_swag_insert(action, action->generic_action.state_set); action->rate = rate; if(action->rate>0) action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0, - workstation_nb + nb_link); + nb_host + nb_link); else action->variable = lmm_variable_new(maxmin_system, action, 1.0, action->rate, - workstation_nb + nb_link); - - if(nb_link + workstation_nb == 0) - action_change_state((surf_action_t) action, SURF_ACTION_DONE); + nb_host + nb_link); for (i = 0; icpu)->constraint, - action->variable, computation_amount[i]); + if(computation_amount[i]>0) + lmm_expand(maxmin_system, ((cpu_Cas01_t) ((workstation_CLM03_t) workstation_list[i])->cpu)->constraint, + action->variable, computation_amount[i]); for (i=0; iid, card_dst->id); for(k=0; k< route_size; k++) { - if(communication_amount[i*workstation_nb+j]>=0) { + if(communication_amount[i*workstation_nb+j]>0) { lmm_expand_add(maxmin_system, route[k]->constraint, action->variable, communication_amount[i*workstation_nb+j]); } @@ -422,10 +450,12 @@ static void surf_workstation_resource_init_internal(void) surf_workstation_resource->common_public->resume = action_resume; surf_workstation_resource->common_public->is_suspended = action_is_suspended; surf_workstation_resource->common_public->set_max_duration = action_set_max_duration; + surf_workstation_resource->common_public->set_priority = action_set_priority; surf_workstation_resource->extension_public->execute = execute; surf_workstation_resource->extension_public->sleep = action_sleep; surf_workstation_resource->extension_public->get_state = get_state; + surf_workstation_resource->extension_public->get_speed = get_speed; surf_workstation_resource->extension_public->communicate = communicate; surf_workstation_resource->extension_public->execute_parallel_task = execute_parallel_task;