Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[surf] Change routing_parse_init() into routing_add_host()
[simgrid.git] / src / surf / surf_interface.cpp
index 5cf6362..b10a504 100644 (file)
@@ -9,11 +9,11 @@
 #include "network_interface.hpp"
 #include "cpu_interface.hpp"
 #include "host_interface.hpp"
-#include "simix/smx_host_private.h"
+#include "src/simix/smx_host_private.h"
 #include "surf_routing.hpp"
 #include "simgrid/sg_config.h"
 #include "mc/mc.h"
-#include "vm_interface.hpp"
+#include "virtual_machine.hpp"
 
 XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
@@ -23,71 +23,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
  * Utils *
  *********/
 
-/* This function is a pimple that we ought to fix. But it won't be easy.
- *
- * The surf_solve() function does properly return the set of actions that
- * changed. Instead, each model change a global data, and then the caller of
- * surf_solve must pick into these sets of action_failed and action_done.
- *
- * This was not clean but ok as long as we didn't had to restart the processes
- * when the resource comes back up.
- * We worked by putting sentinel actions on every resources we are interested
- * in, so that surf informs us if/when the corresponding resource fails.
- *
- * But this does not work to get Simix informed of when a resource comes back
- * up, and this is where this pimple comes. We have a set of resources that are
- * currently down and for which simix needs to know when it comes back up.
- * And the current function is called *at every simulation step* to sweep over
- * that set, searching for a resource that was turned back up in the meanwhile.
- * This is UGLY and slow.
- *
- * The proper solution would be to not rely on globals for the action_failed and
- * action_done swags. They must be passed as parameter by the caller (the
- * handling of these actions in simix may let you think that these two sets can
- * be merged, but their handling in SimDag induce the contrary unless this
- * simdag code can check by itself whether the action is done of failed -- seems
- * very doable, but yet more cleanup to do).
- *
- * Once surf_solve() is passed the set of actions that changed, you want to add
- * a new set of resources back up as parameter to this function. You also want
- * to add a boolean field "restart_watched" to each resource, and make sure that
- * whenever a resource with this field enabled comes back up, it's added to that
- * set so that Simix sees it and react accordingly. This would kill that need
- * for surf to call simix.
- *
- */
-
-/*static void remove_watched_host(void *key)
-{
-  xbt_dict_remove(watched_hosts_lib, *(char**)key);
-}*/
-
-/*void surf_watched_hosts(void)
-{
-  char *key;
-  void *host;
-  xbt_dict_cursor_t cursor;
-  xbt_dynar_t hosts = xbt_dynar_new(sizeof(char*), NULL);
-
-  XBT_DEBUG("Check for host SURF_RESOURCE_ON on watched_hosts_lib");
-  xbt_dict_foreach(watched_hosts_lib, cursor, key, host)
-  {
-    if(SIMIX_host_get_state((smx_host_t)host) == SURF_RESOURCE_ON){
-      XBT_INFO("Restart processes on host: %s", SIMIX_host_get_name((smx_host_t)host));
-      SIMIX_host_autorestart((smx_host_t)host);
-      xbt_dynar_push_as(hosts, char*, key);
-    }
-    else
-      XBT_DEBUG("See SURF_RESOURCE_OFF on host: %s",key);
-  }
-  xbt_dynar_map(hosts, remove_watched_host);
-  xbt_dynar_free(&hosts);
-}*/
-
 /* model_list_invoke contains only surf_host and surf_vm.
  * The callback functions of cpu_model and network_model will be called from
  * those of these host models. */
-xbt_dynar_t model_list = NULL; /* for destroying all models correctly */
+xbt_dynar_t all_existing_models = NULL; /* to destroy models correctly */
 xbt_dynar_t model_list_invoke = NULL;  /* for invoking callbacks */
 
 tmgr_history_t history = NULL;
@@ -378,8 +317,8 @@ void surf_init(int *argc, char **argv)
   SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_storage_free);
 
   xbt_init(argc, argv);
-  if (!model_list)
-    model_list = xbt_dynar_new(sizeof(Model*), NULL);
+  if (!all_existing_models)
+    all_existing_models = xbt_dynar_new(sizeof(Model*), NULL);
   if (!model_list_invoke)
     model_list_invoke = xbt_dynar_new(sizeof(Model*), NULL);
   if (!history)
@@ -415,9 +354,9 @@ void surf_exit(void)
   xbt_lib_free(&file_lib);
   xbt_dict_free(&watched_hosts_lib);
 
-  xbt_dynar_foreach(model_list, iter, model)
+  xbt_dynar_foreach(all_existing_models, iter, model)
     delete model;
-  xbt_dynar_free(&model_list);
+  xbt_dynar_free(&all_existing_models);
   xbt_dynar_free(&model_list_invoke);
   routing_exit();
 
@@ -644,13 +583,18 @@ Resource::Resource()
 {}
 
 Resource::Resource(Model *model, const char *name, xbt_dict_t props)
-  : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
-  , m_running(true), m_stateCurrent(SURF_RESOURCE_ON)
+  : Resource(model, name, props, SURF_RESOURCE_ON)
 {}
 
 Resource::Resource(Model *model, const char *name, xbt_dict_t props, lmm_constraint_t constraint)
+  : Resource(model, name, props, constraint, SURF_RESOURCE_ON)
+{}
+  
+Resource::Resource(
+  Model *model, const char *name, xbt_dict_t props,
+  lmm_constraint_t constraint, e_surf_resource_state_t stateInit)
   : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
-  , m_running(true), m_stateCurrent(SURF_RESOURCE_ON), p_constraint(constraint)
+  , m_running(true), m_stateCurrent(stateInit), p_constraint(constraint)
 {}
 
 Resource::Resource(Model *model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit)
@@ -871,7 +815,7 @@ void Action::setPriority(double priority)
 void Action::cancel(){
   setState(SURF_ACTION_FAILED);
   if (getModel()->getUpdateMechanism() == UM_LAZY) {
-    if (actionLmmHook::is_linked())
+    if (action_lmm_hook.is_linked())
       getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
     heapRemove(getModel()->getActionHeap());
   }
@@ -880,14 +824,14 @@ void Action::cancel(){
 int Action::unref(){
   m_refcount--;
   if (!m_refcount) {
-    if (actionHook::is_linked())
+    if (action_hook.is_linked())
       p_stateSet->erase(p_stateSet->iterator_to(*this));
     if (getVariable())
       lmm_variable_free(getModel()->getMaxminSystem(), getVariable());
     if (getModel()->getUpdateMechanism() == UM_LAZY) {
       /* remove from heap */
       heapRemove(getModel()->getActionHeap());
-      if (actionLmmHook::is_linked())
+      if (action_lmm_hook.is_linked())
         getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
     }
     delete this;