> Storage Id: 'Disk4'
> Storage Type: 'single_SSD'
> Content Type: 'txt_unix'
+> File Descriptor Id: 0
> [ 0.000000] (1:0@denise) Open file '/home/doc/simgrid/examples/platforms/g5k.xml'
> [ 0.000000] (2:1@alice) Capacity of the storage element 'c:\Windows\setupact.log' is stored on: 2391537133 / 536870912000
> [ 0.000000] (3:2@carl) Capacity of the storage element '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml' is stored on: 36946053 / 536870912000
> Storage Id: 'Disk2'
> Storage Type: 'SATA-II_HDD'
> Content Type: 'txt_windows'
+> File Descriptor Id: 0
> [ 0.000000] (2@ bob) File Descriptor information:
> Full path: '/scratch/lib/libsimgrid.so.3.6.2'
> Size: 12710497
> Storage Id: 'Disk1'
> Storage Type: 'SATA-II_HDD'
> Content Type: 'txt_unix'
+> File Descriptor Id: 0
> [ 0.000000] (3@ carl) File Descriptor information:
> Full path: '/scratch/lib/libsimgrid.so.3.6.2'
> Size: 12710497
> Storage Id: 'Disk1'
> Storage Type: 'SATA-II_HDD'
> Content Type: 'txt_unix'
+> File Descriptor Id: 0
> [ 0.000000] (4@ dave) File Descriptor information:
> Full path: 'c:\Windows\bootstat.dat'
> Size: 67584
> Storage Id: 'Disk2'
> Storage Type: 'SATA-II_HDD'
> Content Type: 'txt_windows'
+> File Descriptor Id: 0
> [ 0.000000] (1@alice) Try to read 101663 from 'c:\Windows\setupact.log'
> [ 0.000000] (2@ bob) Try to read 12710497 from '/scratch/lib/libsimgrid.so.3.6.2'
> [ 0.000000] (3@ carl) Try to read 12710497 from '/scratch/lib/libsimgrid.so.3.6.2'
> Storage Id: 'Disk4'
> Storage Type: 'single_SSD'
> Content Type: 'txt_unix'
+> File Descriptor Id: 0
> [ 0.003333] (1:(null)@denise) Free size: 536857490006 bytes
> [ 0.003333] (1:(null)@denise) Used size: 13421994 bytes
> [ 0.004333] (1:(null)@denise) Read 200000 bytes on /home/tmp/data.txt
> Storage Id: 'Disk4'
> Storage Type: 'single_SSD'
> Content Type: 'txt_unix'
+> File Descriptor Id: 0
> [ 0.006000] (1:(null)@denise) *** Move '/tmp/data.txt' into '/tmp/simgrid.readme'
> [ 0.006000] (1:(null)@denise) User data attached to the file: 777
> [ 0.006000] (1:(null)@denise) *** Get/set data for storage element: Disk4 ***
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 */
char* storageId;
char* storage_type;
char* content_type;
+ int desc_id;
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->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;
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
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);
+}
* \see #msg_file_t
*/
+
/********************************* 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\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->content_type);
+ priv->content_type, priv->desc_id);
}
/** \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());
- 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);
+
return fd;
}
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;
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 */
StorageAction *StorageN11::read(surf_file_t fd, sg_size_t size)
{
if(fd->current_position + size > fd->size){
- size = fd->size - fd->current_position;
+ if (fd->current_position > fd->size){
+ size = 0;
+ } else {
+ size = fd->size - fd->current_position;
+ }
fd->current_position = fd->size;
}
else