machine can open the same file several times (yes, yes, it can), which
wasn't supported correctly.
Now each host has a dynar of 1024 descriptor ids (integers). When
opening a file, a process gets (i.e., pops) an available id for that
host, that it releases (i.e., push back) on close.
MSG_file_dump now shows this id.
int is_migrating;
xbt_dict_t affinity_mask_db;
int is_migrating;
xbt_dict_t affinity_mask_db;
+ xbt_dynar_t file_descriptor_table;
#ifdef MSG_USE_DEPRECATED
msg_mailbox_t *mailboxes; /**< the channels */
#ifdef MSG_USE_DEPRECATED
msg_mailbox_t *mailboxes; /**< the channels */
char* storageId;
char* storage_type;
char* content_type;
char* storageId;
char* storage_type;
char* content_type;
void *data;
simdata_file_t simdata;
} s_msg_file_priv_t, *msg_file_priv_t;
void *data;
simdata_file_t simdata;
} s_msg_file_priv_t, *msg_file_priv_t;
priv->affinity_mask_db = xbt_dict_new_homogeneous(NULL);
priv->affinity_mask_db = xbt_dict_new_homogeneous(NULL);
+ priv->file_descriptor_table = xbt_dynar_new(sizeof(int), NULL);
+ for (int i=1023; i>=0;i--)
+ xbt_dynar_push_as(priv->file_descriptor_table, int, i);
+
sg_host_msg_set(host,priv);
return host;
sg_host_msg_set(host,priv);
return host;
XBT_WARN("dp_objs: %u pending task?", size);
xbt_dict_free(&priv->dp_objs);
xbt_dict_free(&priv->affinity_mask_db);
XBT_WARN("dp_objs: %u pending task?", size);
xbt_dict_free(&priv->dp_objs);
xbt_dict_free(&priv->affinity_mask_db);
+ xbt_dynar_free(&priv->file_descriptor_table);
#ifdef MSG_USE_DEPRECATED
free(priv->mailboxes);
#endif
#ifdef MSG_USE_DEPRECATED
free(priv->mailboxes);
#endif
xbt_dict_free(&storage_list);
return contents;
}
xbt_dict_free(&storage_list);
return contents;
}
+
+int __MSG_host_get_file_descriptor_id(msg_host_t host){
+ msg_host_priv_t priv = sg_host_msg(host);
+ xbt_assert(!xbt_dynar_is_empty(priv->file_descriptor_table),
+ "Too much files are opened! Some have to be closed.");
+ return xbt_dynar_pop_as(priv->file_descriptor_table, int);
+}
+
+void __MSG_host_release_file_descriptor_id(msg_host_t host, int id){
+ msg_host_priv_t priv = sg_host_msg(host);
+ xbt_dynar_push_as(priv->file_descriptor_table, int, id);
+}
/********************************* File **************************************/
void __MSG_file_get_info(msg_file_t fd){
/********************************* File **************************************/
void __MSG_file_get_info(msg_file_t fd){
"\t\tMount point: '%s'\n"
"\t\tStorage Id: '%s'\n"
"\t\tStorage Type: '%s'\n"
"\t\tMount point: '%s'\n"
"\t\tStorage Id: '%s'\n"
"\t\tStorage Type: '%s'\n"
- "\t\tContent Type: '%s'",
+ "\t\tContent Type: '%s'\n"
+ "\t\tFile Descriptor Id: %d",
priv->fullpath, priv->size, priv->mount_point,
priv->storageId, priv->storage_type,
priv->fullpath, priv->size, priv->mount_point,
priv->storageId, priv->storage_type,
+ priv->content_type, priv->desc_id);
}
/** \ingroup msg_file_management
}
/** \ingroup msg_file_management
priv->fullpath = xbt_strdup(fullpath);
priv->simdata = xbt_new0(s_simdata_file_t,1);
priv->simdata->smx_file = simcall_file_open(fullpath, MSG_host_self());
priv->fullpath = xbt_strdup(fullpath);
priv->simdata = xbt_new0(s_simdata_file_t,1);
priv->simdata->smx_file = simcall_file_open(fullpath, MSG_host_self());
- name = bprintf("%s:%i:%s",MSG_host_get_name(MSG_host_self()),MSG_process_self_PID(),fullpath);
+ priv->desc_id = __MSG_host_get_file_descriptor_id(MSG_host_self());
+
+ name = bprintf("%s:%s:%d", priv->fullpath, MSG_host_get_name(MSG_host_self()),
+ priv->desc_id);
+
xbt_lib_set(file_lib, name, MSG_FILE_LEVEL, priv);
msg_file_t fd = (msg_file_t) xbt_lib_get_elm_or_null(file_lib, name);
__MSG_file_get_info(fd);
xbt_free(name);
xbt_lib_set(file_lib, name, MSG_FILE_LEVEL, priv);
msg_file_t fd = (msg_file_t) xbt_lib_get_elm_or_null(file_lib, name);
__MSG_file_get_info(fd);
xbt_free(name);
xbt_free(priv->data);
int res = simcall_file_close(priv->simdata->smx_file, MSG_host_self());
xbt_free(priv->data);
int res = simcall_file_close(priv->simdata->smx_file, MSG_host_self());
- name = bprintf("%s:%i:%s",MSG_host_get_name(MSG_host_self()),MSG_process_self_PID(),priv->fullpath);
+ name = bprintf("%s:%s:%d", priv->fullpath, MSG_host_get_name(MSG_host_self()),
+ priv->desc_id);
+ __MSG_host_release_file_descriptor_id(MSG_host_self(), priv->desc_id);
xbt_lib_unset(file_lib, name, MSG_FILE_LEVEL, 1);
xbt_free(name);
return res;
xbt_lib_unset(file_lib, name, MSG_FILE_LEVEL, 1);
xbt_free(name);
return res;
smx_file_t smx_file;
} s_simdata_file_t;
smx_file_t smx_file;
} s_simdata_file_t;
+int __MSG_host_get_file_descriptor_id(msg_host_t host);
+void __MSG_host_release_file_descriptor_id(msg_host_t host, int id);
+
/*************** Begin GPU ***************/
typedef struct simdata_gpu_task {
double flops_amount; /* Computation size */
/*************** Begin GPU ***************/
typedef struct simdata_gpu_task {
double flops_amount; /* Computation size */