Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
minor fixes - Adrien / Takahiro
[simgrid.git] / src / surf / workstation.c
index e1c11b4..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);
@@ -432,6 +441,7 @@ static void surf_workstation_model_init_internal(void)
   /* 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;
@@ -461,13 +471,15 @@ static void surf_workstation_model_init_internal(void)
 
 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);
@@ -476,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);