X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/439b21daa6b4ae15a9ae7d581e966aa4511fbd20..88a573f150347b7a61b6ed2acd1e69da92b7a99b:/src/surf/workstation.c?ds=sidebyside diff --git a/src/surf/workstation.c b/src/surf/workstation.c index f627c89baa..c1de8ae86e 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -7,6 +7,7 @@ #include "xbt/ex.h" #include "xbt/dict.h" #include "portable.h" +#include "surf_private.h" #include "storage_private.h" #include "surf/surf_resource.h" #include "simgrid/sg_config.h" @@ -18,27 +19,25 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf, surf_model_t surf_workstation_model = NULL; -void __init_ws(workstation_CLM03_t ws, const char *id){ +void __init_workstation_CLM03(workstation_CLM03_t ws, const char *id) +{ ws->generic_resource.model = surf_workstation_model; ws->generic_resource.name = xbt_strdup(id); - ws->storage = xbt_lib_get_or_null(storage_lib,id,ROUTING_STORAGE_HOST_LEVEL); - ws->net_elm = xbt_lib_get_or_null(host_lib,id,ROUTING_HOST_LEVEL); - XBT_DEBUG("Create ws %s with %ld mounted disks",id,xbt_dynar_length(ws->storage)); + ws->storage = xbt_lib_get_or_null(storage_lib, id, ROUTING_STORAGE_HOST_LEVEL); + ws->net_elm = xbt_lib_get_or_null(host_lib, id, ROUTING_HOST_LEVEL); + + XBT_DEBUG("Create ws %s with %ld mounted disks", id, xbt_dynar_length(ws->storage)); xbt_lib_set(host_lib, id, SURF_WKS_LEVEL, ws); - ws->generic_resource.model.extension.cpu=cpu_model_cas01(0); } + static void workstation_new(sg_platf_host_cbarg_t host) { workstation_CLM03_t workstation = xbt_new0(s_workstation_CLM03_t, 1); - __init_ws(workstation, host->id, level); -} -static int ws_resource_used(void *resource_id) -{ - THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */ - return -1; + __init_workstation_CLM03(workstation, host->id); } + static void ws_parallel_action_cancel(surf_action_t action) { THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */ @@ -92,25 +91,58 @@ static void ws_action_state_set(surf_action_t action, return; } -static double ws_share_resources(surf_model_t workstation_model, double now) + +/* -- The callback functions at model_private -- */ +/* These callbacks are also used for the vm workstation model. */ +int ws_resource_used(void *resource_id) { -// invoke share_resources on CPU and network (layer 0) - return -1.0; + /* This model does not implement parallel tasks */ + THROW_IMPOSSIBLE; + return -1; } -static void ws_update_actions_state(surf_model_t workstation_model, double now, double delta) +double ws_share_resources(surf_model_t workstation_model, double now) +{ + /* Invoke the share_resources() callback of the physical cpu model object and + * the network model objects. */ + surf_model_t cpu_model = workstation_model->extension.workstation.cpu_model; + surf_model_t net_model = surf_network_model; + + double min_by_cpu = cpu_model->model_private->share_resources(cpu_model, now); + double min_by_net = net_model->model_private->share_resources(net_model, now); + + // XBT_INFO("%p %s min_by_cpu, %s %f min_by_net %f", workstation_model, cpu_model->name, min_by_cpu, net_model->name, min_by_net); + + if (min_by_cpu >= 0.0 && min_by_net >= 0.0) + return min(min_by_cpu, min_by_net); + else if (min_by_cpu >= 0.0) + return min_by_cpu; + else if (min_by_net >= 0.0) + return min_by_net; + else + return min_by_cpu; /* probably min_by_cpu == min_by_net == -1 */ +} + +void ws_update_actions_state(surf_model_t workstation_model, double now, double delta) { return; } -static void ws_update_resource_state(void *id, - tmgr_trace_event_t event_type, - double value, double date) +void ws_update_resource_state(void *id, tmgr_trace_event_t event_type, double value, double date) { - THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */ + /* This model does not implement parallel tasks */ + THROW_IMPOSSIBLE; } -static surf_action_t ws_execute(void *workstation, double size) +void ws_finalize(surf_model_t workstation_model) +{ + surf_model_exit(workstation_model); + workstation_model = NULL; +} + + + +surf_action_t ws_execute(void *workstation, double size) { surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); return cpu->model->extension.cpu.execute(workstation, size); @@ -163,7 +195,7 @@ static void ws_action_set_max_duration(surf_action_t action, DIE_IMPOSSIBLE; } -static void ws_action_set_priority(surf_action_t action, double priority) +void ws_action_set_priority(surf_action_t action, double priority) { if (action->model_obj->type == SURF_MODEL_TYPE_NETWORK) surf_network_model->set_priority(action, priority); @@ -216,7 +248,7 @@ static surf_action_t ws_communicate(void *workstation_src, dst->net_elm, size, rate); } -static e_surf_resource_state_t ws_get_state(void *workstation) +e_surf_resource_state_t ws_get_state(void *workstation) { surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); return cpu->model->extension.cpu.get_state(workstation); @@ -295,12 +327,6 @@ static int ws_link_shared(const void *link) return surf_network_model->extension.network.link_shared(link); } -static void ws_finalize(surf_model_t workstation_model) -{ - surf_model_exit(workstation_model); - workstation_model = NULL; -} - static xbt_dict_t ws_get_properties(const void *ws) { return surf_resource_properties(surf_cpu_resource_priv(ws)); @@ -385,75 +411,75 @@ static surf_action_t ws_action_ls(void *workstation, const char* mount, const ch static void surf_workstation_model_init_internal(void) { - surf_workstation_model = surf_model_init(); - - // TODO surf_workstation_model->extension.cpu=cpu_model_cas01(0); - surf_workstation_model->name = "Workstation"; - surf_workstation_model->type = SURF_MODEL_TYPE_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; - - 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; - surf_workstation_model->extension.workstation.unlink = ws_action_unlink; - surf_workstation_model->extension.workstation.ls = ws_action_ls; + surf_model_t model = surf_model_init(); + + model->name = "Workstation"; + model->type = SURF_MODEL_TYPE_WORKSTATION; + model->action_unref = ws_action_unref; + model->action_cancel = ws_action_cancel; + model->action_state_set = ws_action_state_set; + + model->model_private->resource_used = ws_resource_used; + model->model_private->share_resources = ws_share_resources; + model->model_private->update_actions_state = ws_update_actions_state; + model->model_private->update_resource_state = ws_update_resource_state; + model->model_private->finalize = ws_finalize; + + model->suspend = ws_action_suspend; + model->resume = ws_action_resume; + model->is_suspended = ws_action_is_suspended; + model->set_max_duration = ws_action_set_max_duration; + model->set_priority = ws_action_set_priority; + #ifdef HAVE_TRACING + model->set_category = ws_action_set_category; + #endif + model->get_remains = ws_action_get_remains; + #ifdef HAVE_LATENCY_BOUND_TRACKING + model->get_latency_limited = ws_get_latency_limited; + #endif + + /* For VM support, we have a surf cpu model object for each workstation model + * object. The physical workstation model object has the cpu model object of + * the physical machine layer. */ + xbt_assert(surf_cpu_model_pm); + model->extension.workstation.cpu_model = surf_cpu_model_pm; + + model->extension.workstation.execute = ws_execute; + model->extension.workstation.sleep = ws_action_sleep; + model->extension.workstation.get_state = ws_get_state; + model->extension.workstation.get_speed = ws_get_speed; + model->extension.workstation.get_available_speed = ws_get_available_speed; + + model->extension.workstation.communicate = ws_communicate; + model->extension.workstation.get_route = ws_get_route; + model->extension.workstation.execute_parallel_task = ws_execute_parallel_task; + model->extension.workstation.get_link_bandwidth = ws_get_link_bandwidth; + model->extension.workstation.get_link_latency = ws_get_link_latency; + model->extension.workstation.link_shared = ws_link_shared; + model->extension.workstation.get_properties = ws_get_properties; + + model->extension.workstation.open = ws_action_open; + model->extension.workstation.close = ws_action_close; + model->extension.workstation.read = ws_action_read; + model->extension.workstation.write = ws_action_write; + model->extension.workstation.stat = ws_action_stat; + model->extension.workstation.unlink = ws_action_unlink; + model->extension.workstation.ls = ws_action_ls; + + surf_workstation_model = model; } void surf_workstation_model_init_current_default(void) { - - surf_workstation_model_init_internal(); - xbt_cfg_setdefault_int(_sg_cfg_set, "network/crosstraffic", 1); + surf_cpu_model_init_Cas01(); surf_network_model_init_LegrandVelho(); + /* surf_cpu_mode_pm and surf_network_model must be initialized in advance. */ + xbt_assert(surf_cpu_model_pm); + xbt_assert(surf_network_model); + surf_workstation_model_init_internal(); + xbt_dynar_push(model_list, &surf_workstation_model); xbt_dynar_push(model_list_invoke, &surf_workstation_model); sg_platf_host_add_cb(workstation_new); @@ -462,9 +488,9 @@ void surf_workstation_model_init_current_default(void) void surf_workstation_model_init_compound() { - xbt_assert(surf_cpu_model_pm, "No CPU model defined yet!"); xbt_assert(surf_network_model, "No network model defined yet!"); + surf_workstation_model_init_internal(); xbt_dynar_push(model_list, &surf_workstation_model); xbt_dynar_push(model_list_invoke, &surf_workstation_model);