Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
minor fixes - Adrien / Takahiro
[simgrid.git] / src / surf / workstation.c
index 9cf1106..c1de8ae 100644 (file)
@@ -19,14 +19,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf,
 surf_model_t surf_workstation_model = NULL;
 
 
-void __init_workstation_CLM03(workstation_CLM03_t ws, const char *id, surf_model_t workstation_model)
+void __init_workstation_CLM03(workstation_CLM03_t ws, const char *id)
 {
-  ws->generic_resource.model = workstation_model;
+  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);
+  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_DEBUG("Create ws %s with %ld mounted disks", id, xbt_dynar_length(ws->storage));
   xbt_lib_set(host_lib, id, SURF_WKS_LEVEL, ws);
 }
 
@@ -34,7 +34,7 @@ static void workstation_new(sg_platf_host_cbarg_t host)
 {
   workstation_CLM03_t workstation = xbt_new0(s_workstation_CLM03_t, 1);
 
-  __init_workstation_CLM03(workstation, host->id, surf_workstation_model);
+  __init_workstation_CLM03(workstation, host->id);
 }
 
 
@@ -111,7 +111,16 @@ double ws_share_resources(surf_model_t workstation_model, double now)
   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);
 
-  return min(min_by_cpu, min_by_net);
+ // 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)
@@ -133,7 +142,7 @@ void ws_finalize(surf_model_t workstation_model)
 
 
 
-static surf_action_t ws_execute(void *workstation, double size)
+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);
@@ -186,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);
@@ -239,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);
@@ -402,79 +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();
-
-  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_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. */
-  surf_workstation_model->extension.workstation.cpu_model = surf_cpu_model_pm;
-
-  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;
+  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);
@@ -483,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);