Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add a SD_workstation_get_current_task function
[simgrid.git] / src / simdag / sd_global.c
index a2caf4b..093b77e 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "private.h"
 #include "xbt/sysdep.h"
 #include "xbt/dynar.h"
@@ -13,187 +19,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_kernel, sd,
 
 SD_global_t sd_global = NULL;
 
-/* $Id$ */
-
-/* Copyright (c) 2007 Arnaud Legrand.
-   All rights reserved.                                          */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-static int _sd_init_status = 0; /* 0: beginning of time; 
-                                   1: pre-inited (cfg_set created); 
-                                   2: inited (running) */
-static xbt_cfg_t _sd_cfg_set = NULL;
-
-/* callback of the workstation_model variable */
-static void _sd_cfg_cb__workstation_model(const char *name, int pos)
-{
-  char *val;
-
-  xbt_assert0(_sd_init_status < 2,
-              "Cannot change the model after the initialization");
-
-  val = xbt_cfg_get_string(_sd_cfg_set, name);
-  find_model_description(surf_workstation_model_description, val);
-}
-
-/* callback of the cpu_model variable */
-static void _sd_cfg_cb__cpu_model(const char *name, int pos)
-{
-  char *val;
-
-  xbt_assert0(_sd_init_status < 2,
-              "Cannot change the model after the initialization");
-
-  val = xbt_cfg_get_string(_sd_cfg_set, name);
-  find_model_description(surf_cpu_model_description, val);
-}
-
-/* callback of the workstation_model variable */
-static void _sd_cfg_cb__network_model(const char *name, int pos)
-{
-  char *val;
-
-  xbt_assert0(_sd_init_status < 2,
-              "Cannot change the model after the initialization");
-
-  val = xbt_cfg_get_string(_sd_cfg_set, name);
-  find_model_description(surf_network_model_description, val);
-}
-
 XBT_LOG_EXTERNAL_CATEGORY(sd_kernel);
 XBT_LOG_EXTERNAL_CATEGORY(sd_task);
 XBT_LOG_EXTERNAL_CATEGORY(sd_workstation);
 
-/* create the config set and register what should be */
-static void sd_config_init(void)
-{
-
-  if (_sd_init_status)
-    return;                     /* Already inited, nothing to do */
-
-  /* Connect our log channels: that must be done manually under windows */
-  XBT_LOG_CONNECT(sd_kernel, sd);
-  XBT_LOG_CONNECT(sd_task, sd);
-  XBT_LOG_CONNECT(sd_workstation, sd);
-
-  _sd_init_status = 1;
-  _sd_cfg_set = xbt_cfg_new();
-
-  xbt_cfg_register(_sd_cfg_set,
-                   "workstation_model", xbt_cfgelm_string, 1, 1,
-                   &_sd_cfg_cb__workstation_model, NULL);
-
-  xbt_cfg_register(_sd_cfg_set,
-                   "cpu_model", xbt_cfgelm_string, 1, 1,
-                   &_sd_cfg_cb__cpu_model, NULL);
-  xbt_cfg_register(_sd_cfg_set,
-                   "network_model", xbt_cfgelm_string, 1, 1,
-                   &_sd_cfg_cb__network_model, NULL);
-
-  xbt_cfg_set_string(_sd_cfg_set, "workstation_model", "ptask_L07");
-}
-
-static void sd_config_finalize(void)
-{
-
-  if (!_sd_init_status)
-    return;                     /* Not initialized yet. Nothing to do */
-
-  xbt_cfg_free(&_sd_cfg_set);
-  _sd_init_status = 0;
-}
-
-static void sd_config(const char *name, va_list pa)
-{
-  if (!_sd_init_status) {
-    sd_config_init();
-  }
-  xbt_cfg_set_vargs(_sd_cfg_set, name, pa);
-}
-
-
-static void __sd_config_helper(const char *name, ...)
-{
-  va_list pa;
-  va_start(pa, name);
-
-  sd_config(name, pa);
-
-  va_end(pa);
-}
-
-static void sd_cfg_control_set(const char *control_string)
-{
-  /* To split the string in commands, and the cursors */
-  xbt_dynar_t set_strings;
-  char *str;
-  unsigned int cpt;
-
-  if (!control_string)
-    return;
-  DEBUG1("Parse log settings '%s'", control_string);
-
-  /* split the string, and remove empty entries */
-  set_strings = xbt_str_split_quoted(control_string);
-
-  if (xbt_dynar_length(set_strings) == 0) {     /* vicious user! */
-    xbt_dynar_free(&set_strings);
-    return;
-  }
-  /* Parse each entry and either use it right now (if the category was already
-     created), or store it for further use */
-  xbt_dynar_foreach(set_strings, cpt, str) {
-    char *control_string, *control_string_sav, *name, *value;
-
-
-    control_string = control_string_sav = strdup(str);
-    control_string += strspn(control_string, " ");
-    name = control_string;
-    control_string += strcspn(str, ":=");
-    value = control_string;
-    *value = 0;
-    value++;
-
-    xbt_assert1(strlen(name) != 0, "Invalid name for configuration: '%s'",
-                name);
-    xbt_assert1(strlen(value) != 0,
-                "Invalid value for configuration: '%s'", value);
-    INFO2("setting '%s' to '%s'", name, value);
-
-    __sd_config_helper(name, value);
-
-    free(control_string_sav);
-  }
-  xbt_dynar_free(&set_strings);
-}
-
-static void sd_cfg_init(int *argc, char **argv)
-{
-  int i, j;
-  char *opt;
-
-  for (i = 1; i < *argc; i++) {
-    if (!strncmp(argv[i], "--cfg=", strlen("--cfg="))) {
-      opt = strchr(argv[i], '=');
-      opt++;
-
-      sd_cfg_control_set(opt);
-      DEBUG1("Did apply '%s' as config setting", opt);
-      /*remove this from argv */
-
-      for (j = i + 1; j < *argc; j++) {
-        argv[j - 1] = argv[j];
-      }
-
-      argv[j - 1] = NULL;
-      (*argc)--;
-      i--;                      /* compensate effect of next loop incrementation */
-    }
-  }
-}
-
 /**
  * \brief Initialises SD internal data
  *
@@ -211,6 +40,12 @@ void SD_init(int *argc, char **argv)
 
   xbt_assert0(!SD_INITIALISED(), "SD_init() already called");
 
+  /* Connect our log channels: that must be done manually under windows */
+  XBT_LOG_CONNECT(sd_kernel, sd);
+  XBT_LOG_CONNECT(sd_task, sd);
+  XBT_LOG_CONNECT(sd_workstation, sd);
+
+
   sd_global = xbt_new(s_SD_global_t, 1);
   sd_global->workstations = xbt_dict_new();
   sd_global->workstation_count = 0;
@@ -238,15 +73,15 @@ void SD_init(int *argc, char **argv)
   sd_global->task_number = 0;
 
   surf_init(argc, argv);
-  sd_cfg_init(argc, argv);
+  xbt_cfg_set_string(_surf_cfg_set, "workstation/model", "ptask_L07");
 }
 
 /**
  * \brief Reinits the application part of the simulation (experimental feature)
- * 
- * This function allows you to run several simulations on the same platform 
- * by resetting the part describing the application. 
- * 
+ *
+ * This function allows you to run several simulations on the same platform
+ * by resetting the part describing the application.
+ *
  * @warning: this function is still experimental and not perfect. For example,
  * the simulation clock (and traces usage) is not reset. So, do not use it if
  * you use traces in your simulation, and do not use absolute timing after using it.
@@ -304,7 +139,7 @@ void SD_application_reinit(void)
  *
  *     \include simgrid.dtd
  *
- * Here is a small example of such a platform: 
+ * Here is a small example of such a platform:
  *
  *     \include small_platform.xml
  */
@@ -314,79 +149,22 @@ void SD_create_environment(const char *platform_file)
   char *name = NULL;
   void *surf_workstation = NULL;
   void *surf_link = NULL;
-  char *workstation_model_name;
-  int workstation_id = -1;
 
   SD_CHECK_INIT_DONE();
 
   DEBUG0("SD_create_environment");
 
-  sd_config_init();
-  surf_timer_model_init(platform_file);
-
-  workstation_model_name =
-    xbt_cfg_get_string(_sd_cfg_set, "workstation_model");
-
-  DEBUG1("Model : %s", workstation_model_name);
-  workstation_id =
-    find_model_description(surf_workstation_model_description,
-                           workstation_model_name);
-  if (!strcmp(workstation_model_name, "compound")) {
-    xbt_ex_t e;
-    char *network_model_name = NULL;
-    char *cpu_model_name = NULL;
-    int network_id = -1;
-    int cpu_id = -1;
-
-    TRY {
-      cpu_model_name = xbt_cfg_get_string(_sd_cfg_set, "cpu_model");
-    } CATCH(e) {
-      if (e.category == bound_error) {
-        xbt_assert0(0,
-                    "Set a cpu model to use with the 'compound' workstation model");
-        xbt_ex_free(e);
-      } else {
-        RETHROW;
-      }
-    }
-
-    TRY {
-      network_model_name = xbt_cfg_get_string(_sd_cfg_set, "network_model");
-    }
-    CATCH(e) {
-      if (e.category == bound_error) {
-        xbt_assert0(0,
-                    "Set a network model to use with the 'compound' workstation model");
-        xbt_ex_free(e);
-      } else {
-        RETHROW;
-      }
-    }
-
-    network_id =
-      find_model_description(surf_network_model_description,
-                             network_model_name);
-    cpu_id =
-      find_model_description(surf_cpu_model_description, cpu_model_name);
-
-    surf_cpu_model_description[cpu_id].model_init(platform_file);
-    surf_network_model_description[network_id].model_init(platform_file);
-  }
-
-  DEBUG0("Call workstation_model_init");
-  surf_workstation_model_description[workstation_id].model_init
-    (platform_file);
+  surf_config_models_setup(platform_file);
 
   parse_platform_file(platform_file);
 
-  _sd_init_status = 2;
-
   /* now let's create the SD wrappers for workstations and links */
-  xbt_dict_foreach(workstation_set, cursor, name, surf_workstation) {
+  xbt_dict_foreach(surf_model_resource_set(surf_workstation_model), cursor,
+                   name, surf_workstation) {
     __SD_workstation_create(surf_workstation, NULL);
   }
 
-  xbt_dict_foreach(link_set, cursor, name, surf_link) {
+  xbt_dict_foreach(surf_model_resource_set(surf_network_model), cursor, name, surf_link) {
     __SD_link_create(surf_link, NULL);
   }
 
@@ -401,7 +179,7 @@ void SD_create_environment(const char *platform_file)
  * The simulation will be stopped when its time reaches \a how_long,
  * when a watch point is reached, or when no more task can be executed.
  * Then you can call SD_simulate() again.
- * 
+ *
  * \param how_long maximum duration of the simulation (a negative value means no time limit)
  * \return a NULL-terminated array of \ref SD_task_t whose state has changed.
  * \see SD_task_schedule(), SD_task_watch()
@@ -428,8 +206,8 @@ SD_task_t *SD_simulate(double how_long)
   }
 
   if (how_long > 0) {
-    surf_timer_model->extension_public->set(surf_get_clock() + how_long,
-                                            NULL, NULL);
+    surf_timer_model->extension.timer.set(surf_get_clock() + how_long,
+                                          NULL, NULL);
   }
   sd_global->watch_point_reached = 0;
 
@@ -460,10 +238,10 @@ SD_task_t *SD_simulate(double how_long)
 
     /* let's see which tasks are done */
     xbt_dynar_foreach(model_list, iter, model) {
-      while ((action =
-              xbt_swag_extract(model->common_public->states.
-                               done_action_set))) {
+      while ((action = xbt_swag_extract(model->states.done_action_set))) {
         task = action->data;
+        task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
+        task->finish_time = surf_get_clock();
         INFO1("Task '%s' done", SD_task_get_name(task));
         DEBUG0("Calling __SD_task_just_done");
         __SD_task_just_done(task);
@@ -491,13 +269,13 @@ SD_task_t *SD_simulate(double how_long)
       }
 
       /* let's see which tasks have just failed */
-      while ((action =
-              xbt_swag_extract(model->common_public->states.
-                               failed_action_set))) {
+      while ((action = xbt_swag_extract(model->states.failed_action_set))) {
         task = action->data;
+        task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
+        task->finish_time = surf_get_clock();
         INFO1("Task '%s' failed", SD_task_get_name(task));
         __SD_task_set_state(task, SD_FAILED);
-        surf_workstation_model->common_public->action_free(action);
+        surf_workstation_model->action_unref(action);
         task->surf_action = NULL;
 
         if (!xbt_dynar_member(changed_tasks, &task))
@@ -505,7 +283,7 @@ SD_task_t *SD_simulate(double how_long)
       }
     }
 
-    while (surf_timer_model->extension_public->get(&fun, (void *) &arg)) {
+    while (surf_timer_model->extension.timer.get(&fun, (void *) &arg)) {
     }
   }