Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add MSG_host_on and MSG_host_off
[simgrid.git] / src / surf / workstation.c
index 33bfedf..5e2271c 100644 (file)
@@ -121,6 +121,10 @@ static int constraint_is_active(cpu_Cas01_t cpu_cas01)
   return found;
 }
 
+/* Each VM has a dummy CPU action on the PM layer. This CPU action works as the
+ * constraint (capacity) of the VM in the PM layer. If the VM does not have any
+ * active task, the dummy CPU action must be deactivated, so that the VM does
+ * not get any CPU share in the PM layer. */
 static void adjust_weight_of_dummy_cpu_actions(void)
 {
   /* iterate for all hosts including virtual machines */
@@ -268,6 +272,17 @@ void ws_action_set_priority(surf_action_t action, double priority)
     DIE_IMPOSSIBLE;
 }
 
+void ws_action_set_bound(surf_action_t action, double bound)
+{
+  /* FIXME: only for CPU model object? */
+  if (action->model_obj->type == SURF_MODEL_TYPE_NETWORK)
+    surf_network_model->set_bound(action, bound);
+  else if (action->model_obj->type == SURF_MODEL_TYPE_CPU)
+    action->model_obj->set_bound(action, bound);
+  else
+    DIE_IMPOSSIBLE;
+}
+
 #ifdef HAVE_TRACING
 static void ws_action_set_category(surf_action_t action, const char *category)
 {
@@ -317,7 +332,13 @@ e_surf_resource_state_t ws_get_state(void *workstation)
   return cpu->model->extension.cpu.get_state(workstation);
 }
 
-static double ws_get_speed(void *workstation, double load)
+void ws_set_state(void *workstation, e_surf_resource_state_t state)
+{
+  surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation));
+  cpu->model->extension.cpu.set_state(workstation, state);
+}
+
+double ws_get_speed(void *workstation, double load)
 {
   surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation));
   return cpu->model->extension.cpu.get_speed(workstation, load);
@@ -532,6 +553,7 @@ static void surf_workstation_model_init_internal(void)
   model->is_suspended     = ws_action_is_suspended;
   model->set_max_duration = ws_action_set_max_duration;
   model->set_priority     = ws_action_set_priority;
+  model->set_bound        = ws_action_set_bound;
   #ifdef HAVE_TRACING
   model->set_category     = ws_action_set_category;
   #endif
@@ -549,6 +571,7 @@ static void surf_workstation_model_init_internal(void)
   model->extension.workstation.execute   = ws_execute;
   model->extension.workstation.sleep     = ws_action_sleep;
   model->extension.workstation.get_state = ws_get_state;
+  model->extension.workstation.set_state = ws_set_state;
   model->extension.workstation.get_speed = ws_get_speed;
   model->extension.workstation.get_available_speed = ws_get_available_speed;