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;
}
action->data=data;
}
+/* HACKHACK: msg_global must be set to a sensible value (like NULL) to use the logging mecanisme
+ * since log_default_appender use xbt_procname which, in SG, is defined in src/msg/m_process.c
+ * (in RL, xbt_procname is defined in src/gras/Virtu/rl_process.c)
+ */
+extern void *msg_global;
+
void surf_init(int *argc, char **argv)
{
int i,j;
char *opt;
xbt_init(argc, argv);
+ msg_global=NULL; /* see HACKHACK note above */
if (!surf_path) {
const char *initial_path = "./";
surf_path = xbt_dynar_new(sizeof(char*), NULL);
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;
- static char* path_name = 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(!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;
+
+ 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;
}
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)