#include "surf_private.h"
#include "xbt/module.h"
+typedef struct surf_resource_object {
+ surf_resource_t resource;
+} s_surf_resource_object_t, *surf_resource_object_t;
+
+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));
void surf_action_free(surf_action_t * action)
{
(*action)->resource_type->common_public->action_cancel(*action);
- xbt_free(*action);
+ free(*action);
*action = NULL;
}
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)
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;
+ int path_name_len = 0; /* don't count '\0' */
+
+ xbt_assert0(name, "Need a non-NULL file name");
+
+ xbt_assert0(surf_path,"surf_init has to be called before using surf_fopen");
+
+ if (name[0] == '/') { /* don't mess with absolute file names */
+ return fopen(name,mode);
+
+ } else { /* search relative files in the path */
+
+ if(!path_name) {
+ path_name_len = strlen(name);
+ path_name=xbt_new0(char,path_name_len+1);
+ }
+
+ xbt_dynar_foreach(surf_path,i,path) {
+ if(path_name_len < strlen(path)+strlen(name)+1) {
+ path_name_len = strlen(path)+strlen(name)+1; /* plus '/' */
+ path_name=xbt_realloc(path_name,path_name_len+1);
+ }
+ sprintf(path_name,"%s/%s",path, name);
+ file = fopen(path_name,mode);
+ if (file) return file;
+ }
+ }
+ return file;
+}
+
void surf_finalize(void)
{
int i;
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) {
+ free(path_name);
+ path_name = NULL;
+ }
}
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)