Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use doxygen's section instead of my poor approximation; link to the list of all exist...
[simgrid.git] / src / surf / surf.c
index 5308482..2ff094e 100644 (file)
@@ -8,21 +8,34 @@
 #include "surf_private.h"
 #include "xbt/module.h"
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_global, surf,
+                               "Logging specific to the SURF global module");
+
+
 static double NOW = 0;
 
 xbt_dynar_t resource_list = NULL;
 tmgr_history_t history = NULL;
 lmm_system_t maxmin_system = NULL;
+xbt_dynar_t surf_path = NULL;
 
 double generic_maxmin_share_resources(xbt_swag_t running_actions,
-                                     size_t offset)
+                                      size_t offset)
+{
+  return  generic_maxmin_share_resources2(running_actions, offset,
+                                         maxmin_system);
+}
+
+double generic_maxmin_share_resources2(xbt_swag_t running_actions,
+                                      size_t offset,
+                                      lmm_system_t sys)
 {
   surf_action_t action = NULL;
   double min = -1;
   double value = -1;
 #define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
 
-  lmm_solve(maxmin_system);
+  lmm_solve(sys);
 
   xbt_swag_foreach(action, running_actions) {
     value = lmm_variable_getvalue(VARIABLE(action));
@@ -103,9 +116,38 @@ void surf_action_change_state(surf_action_t action,
     xbt_swag_insert(action, action->state_set);
 }
 
+void surf_action_set_data(surf_action_t action,
+                         void *data)
+{
+  action->data=data;
+}
+
 void surf_init(int *argc, char **argv)
 {
+  int i,j;
+  char *opt;
+
   xbt_init(argc, argv);
+  if (!surf_path) {
+    const char *initial_path = "./";
+    surf_path = xbt_dynar_new(sizeof(char*), NULL);
+    xbt_dynar_push(surf_path,&initial_path);
+
+    for (i=1; i<*argc; i++) {
+      if (!strncmp(argv[i],"--surf-path=",strlen("--surf-path="))) {
+       opt=strchr(argv[i],'=');
+       opt++;
+       xbt_dynar_push(surf_path,&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 */
+      }
+    }
+  }
   if (!resource_list)
     resource_list = xbt_dynar_new(sizeof(surf_resource_private_t), NULL);
   if (!history)
@@ -114,6 +156,30 @@ void surf_init(int *argc, char **argv)
     maxmin_system = lmm_system_new();
 }
 
+static char* path_name = NULL;
+FILE *surf_fopen(const char *name, const char *mode)
+{
+  int i; 
+  char* path = NULL;
+  FILE *file = NULL;
+
+  xbt_assert1((name!=NULL), "Need a real file name, not \"%s\"\n",name);
+
+  xbt_assert0(surf_path,"surf_init has to be called before using surf_fopen");
+  if(!path_name) path_name=xbt_new0(char,strlen(name)+1);
+
+  xbt_dynar_foreach(surf_path,i,path) {
+    if(strlen(path_name)<strlen(path)+strlen(name)+2) 
+      path_name=xbt_realloc(path_name,strlen(path)+strlen(name)+2);
+    strcpy(path_name, path);
+    strcat(path_name,"/");
+    strcat(path_name,name);
+    file = fopen(path_name,mode);
+    if(file) return file;
+  }
+  return file;
+}
+
 void surf_finalize(void)
 {
   int i;
@@ -134,7 +200,15 @@ void surf_finalize(void)
   if (resource_list)
     xbt_dynar_free(&resource_list);
 
+  if(surf_path) 
+    xbt_dynar_free(&surf_path);
+
   tmgr_finalize();
+  surf_parse_lex_destroy();
+  if(path_name) {
+    xbt_free(path_name);
+    path_name = NULL;
+  }
 }
 
 double surf_solve(void)
@@ -180,7 +254,7 @@ double surf_solve(void)
   }
 
   if (min < 0.0)
-    return 0.0;
+    return -1.0;
 
   while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
     if (next_event_date > NOW + min)