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 02e1d96..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,9 +97,9 @@ 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();
+  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();