Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SURF] Added comment for surf_share_resources
[simgrid.git] / src / surf / surf_c_bindings.cpp
index d5a0cb0..cb638c0 100644 (file)
@@ -26,6 +26,10 @@ static WorkstationPtr get_casted_workstation(surf_resource_t resource){
   return static_cast<WorkstationPtr>(surf_workstation_resource_priv(resource));
 }
 
+static RoutingEdgePtr get_casted_routing(surf_resource_t resource){
+  return static_cast<RoutingEdgePtr>(surf_routing_resource_priv(resource));
+}
+
 static WorkstationVMPtr get_casted_vm_workstation(surf_resource_t resource){
   return static_cast<WorkstationVMPtr>(surf_workstation_resource_priv(resource));
 }
@@ -70,6 +74,18 @@ void surf_presolve(void)
       model->updateActionsState(NOW, 0.0);
 }
 
+/**
+ * Computes when the next action executed in a
+ * specific model terminates; this is important,
+ * because we can safely skip the amount of time
+ * in which no model (read: not even a single one)
+ * changes its state; so, if for instance network,
+ * cpu, storage don't change (and if we assume they're
+ * the only models we use... simple example here :) )
+ * for 2s, 1s, 3s then we can skip 1s as after this
+ * amount of time the new state needs to be considered.
+ *
+ */
 static void surf_share_resources(surf_model_t model)
 {
   double next_action_end = -1.0;
@@ -194,9 +210,7 @@ double surf_solve(double max_date)
     surf_update_actions_state(model);
   }
 
-#ifdef HAVE_TRACING
   TRACE_paje_dump_buffer (0);
-#endif
 
   return surf_min;
 }
@@ -268,10 +282,10 @@ int surf_model_running_action_set_size(surf_model_t model){
 surf_action_t surf_workstation_model_execute_parallel_task(surf_workstation_model_t model,
                                                    int workstation_nb,
                                             void **workstation_list,
-                                            double *computation_amount,
-                                            double *communication_amount,
+                                            double *flops_amount,
+                                            double *bytes_amount,
                                             double rate){
-  return static_cast<ActionPtr>(model->executeParallelTask(workstation_nb, workstation_list, computation_amount, communication_amount, rate));
+  return static_cast<ActionPtr>(model->executeParallelTask(workstation_nb, workstation_list, flops_amount, bytes_amount, rate));
 }
 
 surf_action_t surf_workstation_model_communicate(surf_workstation_model_t model, surf_resource_t src, surf_resource_t dst, double size, double rate){
@@ -402,7 +416,16 @@ int surf_workstation_file_move(surf_resource_t workstation, surf_file_t fd, cons
 }
 
 xbt_dynar_t surf_workstation_get_vms(surf_resource_t resource){
-  return get_casted_workstation(resource)->getVms();
+  xbt_dynar_t vms = get_casted_workstation(resource)->getVms();
+  xbt_dynar_t vms_ = xbt_dynar_new(sizeof(smx_host_t), NULL);
+  unsigned int cpt;
+  WorkstationVMPtr vm;
+  xbt_dynar_foreach(vms, cpt, vm) {
+    smx_host_t vm_ = xbt_lib_get_elm_or_null(host_lib, vm->getName());
+    xbt_dynar_push(vms_, &vm_);
+  }
+  xbt_dynar_free(&vms);
+  return vms_;
 }
 
 void surf_workstation_get_params(surf_resource_t resource, ws_params_t params){
@@ -414,7 +437,30 @@ void surf_workstation_set_params(surf_resource_t resource, ws_params_t params){
 }
 
 void surf_vm_workstation_destroy(surf_resource_t resource){
-  delete get_casted_vm_workstation(resource);
+  /* ind_phys_workstation equals to smx_host_t */
+  //surf_resource_t ind_vm_workstation = xbt_lib_get_elm_or_null(host_lib, getName());
+
+  /* Before clearing the entries in host_lib, we have to pick up resources. */
+  CpuPtr cpu = get_casted_cpu(resource);
+  WorkstationVMPtr vm = get_casted_vm_workstation(resource);
+  RoutingEdgePtr routing = get_casted_routing(resource);
+  char* name = xbt_dict_get_elm_key(resource);
+  /* We deregister objects from host_lib, without invoking the freeing callback
+   * of each level.
+   *
+   * Do not call xbt_lib_remove() here. It deletes all levels of the key,
+   * including MSG_HOST_LEVEL and others. We should unregister only what we know.
+   */
+  xbt_lib_unset(host_lib, name, SURF_CPU_LEVEL, 0);
+  xbt_lib_unset(host_lib, name, ROUTING_HOST_LEVEL, 0);
+  xbt_lib_unset(host_lib, name, SURF_WKS_LEVEL, 0);
+
+  /* TODO: comment out when VM storage is implemented. */
+  // xbt_lib_unset(host_lib, name, SURF_STORAGE_LEVEL, 0);
+
+  delete cpu;
+  delete vm;
+  delete routing;
 }
 
 void surf_vm_workstation_suspend(surf_resource_t resource){
@@ -521,11 +567,9 @@ void surf_action_set_priority(surf_action_t action, double priority){
   action->setPriority(priority);
 }
 
-#ifdef HAVE_TRACING
 void surf_action_set_category(surf_action_t action, const char *category){
   action->setCategory(category);
 }
-#endif
 
 void *surf_action_get_data(surf_action_t action){
   return action->getData();