-/* 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;
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);
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;
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.
}
}
+
xbt_dynar_foreach (resource_list,i,resource) {
resource->common_private->update_actions_state(NOW, min);
}