Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Each action can now have a maximum duration. That is a convenient way to
[simgrid.git] / src / surf / surf.c
index 5be1d87..a563608 100644 (file)
@@ -1,9 +1,12 @@
-/* Authors: Arnaud Legrand                                                  */
+/*     $Id$     */
+
+/* Copyright (c) 2004 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. */
* under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "surf_private.h"
+#include "xbt/module.h"
 
 static xbt_heap_float_t NOW=0;
 
@@ -11,6 +14,48 @@ xbt_dynar_t resource_list = NULL;
 tmgr_history_t history = NULL;
 lmm_system_t maxmin_system = NULL;
 
+xbt_heap_float_t generic_maxmin_share_resources(xbt_swag_t running_actions,
+                                               size_t offset)
+{
+  surf_action_t action = NULL;
+  xbt_maxmin_float_t min = -1;
+  xbt_maxmin_float_t value = -1;
+#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
+
+ lmm_solve(maxmin_system);
+
+  xbt_swag_foreach(action, running_actions) {
+    value = lmm_variable_getvalue(VARIABLE(action));
+    if((value>0) || (action->max_duration>=0)) break;
+  }
+  
+  if (!action)
+    return -1.0;
+
+  if(value>0) {
+    min = value = action->remains / value;
+    if((action->max_duration>=0) && 
+       (action->max_duration<min))
+      min = action->max_duration;
+  }  else min = action->max_duration;
+
+  
+  for(action=xbt_swag_getNext(action,running_actions->offset);
+      action;
+      action=xbt_swag_getNext(action,running_actions->offset)) {
+    value = lmm_variable_getvalue(VARIABLE(action));
+    if(value>0) {
+      value = action->remains / value;
+      if (value < min) min = value;
+    }
+    if((action->max_duration>=0) && 
+       (action->max_duration<min))
+      min = action->max_duration;
+  }
+#undef VARIABLE
+  return min;
+}
+
 e_surf_action_state_t surf_action_get_state(surf_action_t action)
 {
   surf_action_state_t action_state = &(action->resource_type->common_public->states); 
@@ -52,13 +97,36 @@ void surf_action_change_state(surf_action_t action, e_surf_action_state_t state)
   if(action->state_set) xbt_swag_insert(action, action->state_set);
 }
 
-void surf_init(void)
+void surf_init(int *argc, char **argv)
 {
+  xbt_init(argc, argv);
   if(!resource_list) resource_list = xbt_dynar_new(sizeof(surf_resource_private_t), NULL);
   if(!history) history = tmgr_history_new();
   if(!maxmin_system) maxmin_system = lmm_system_new();
 }
 
+void surf_finalize(void)
+{ 
+  int i;
+  surf_resource_t resource = NULL;
+
+  xbt_dynar_foreach (resource_list,i,resource) {
+    resource->common_private->finalize();
+  }
+
+  if(maxmin_system) {
+    lmm_system_free(maxmin_system);
+    maxmin_system = NULL;
+  }
+  if(history) {
+    tmgr_history_free(history);
+    history = NULL;
+  }
+  if(resource_list) xbt_dynar_free(&resource_list);
+
+  tmgr_finalize();
+}
+
 xbt_heap_float_t surf_solve(void)
 {
   static int first_run = 1;
@@ -92,15 +160,17 @@ xbt_heap_float_t surf_solve(void)
 
   xbt_dynar_foreach (resource_list,i,resource) {
     resource_next_action_end = resource->common_private->share_resources(NOW);
-    if((min<0) || (resource_next_action_end<min)) 
+    if(((min<0.0) || (resource_next_action_end<min)) && (resource_next_action_end>=0.0))
       min = resource_next_action_end;
   }
 
+  if(min<0.0) return 0.0;
+
   while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
     if(next_event_date > NOW+min) break;
     while ((event=tmgr_history_get_next_event_leq(history, next_event_date,
                                                  &value, (void **) &resource_obj))) {
-      if(resource_obj->resource->common_public->resource_used(resource_obj)) {
+      if(resource_obj->resource->common_private->resource_used(resource_obj)) {
        min = next_event_date-NOW;
       }
       /* update state of resource_obj according to new value. Does not touch lmm.
@@ -110,6 +180,7 @@ xbt_heap_float_t surf_solve(void)
     }
   }
 
+
   xbt_dynar_foreach (resource_list,i,resource) {
     resource->common_private->update_actions_state(NOW, min);
   }