typedef struct msg_file {
char *fullname; /**< @brief file full name (path+name)*/
simdata_file_t simdata; /**< @brief simulator data */
- void *data; /**< @brief user data */
msg_file_info_t info;
} s_msg_file_t;
/************************** File handling ***********************************/
XBT_PUBLIC(size_t) MSG_file_read(size_t size, msg_file_t fd);
XBT_PUBLIC(size_t) MSG_file_write(size_t size, msg_file_t fd);
-XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path);
+XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path,
+ void* data);
+XBT_PUBLIC(void*) MSG_file_get_data(msg_file_t fd);
+XBT_PUBLIC(msg_error_t) MSG_file_set_data(msg_file_t fd, void * data);
XBT_PUBLIC(int) MSG_file_close(msg_file_t fd);
XBT_PUBLIC(size_t) MSG_file_get_size(msg_file_t fd);
XBT_PUBLIC(void) MSG_file_dump(msg_file_t fd);
XBT_PUBLIC(int) SIMIX_comm_has_recv_match(smx_rdv_t rdv, int (*match_fun)(void*, void*), void* data);
XBT_PUBLIC(void) SIMIX_comm_finish(smx_action_t action);
+/*********************************** File *************************************/
+XBT_PUBLIC(void*) SIMIX_file_get_data(smx_file_t fd);
+XBT_PUBLIC(void) SIMIX_file_set_data(smx_file_t fd, void *data);
+
/******************************************************************************/
/* SIMIX simcalls */
/******************************************************************************/
XBT_PUBLIC(int) simcall_sem_get_capacity(smx_sem_t sem);
/***************************** File **********************************/
+XBT_PUBLIC(void *) simcall_file_get_data(smx_file_t fd);
+XBT_PUBLIC(void) simcall_file_set_data(smx_file_t fd, void *data);
XBT_PUBLIC(size_t) simcall_file_read(size_t size, smx_file_t fd);
XBT_PUBLIC(size_t) simcall_file_write(size_t size, smx_file_t fd);
XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path);
xbt_dynar_free_container(&info);
}
+
+/** \ingroup msg_file_management
+ *
+ * \brief Set the user data of a #msg_file_t.
+ *
+ * This functions checks whether some data has already been associated to \a file
+ or not and attach \a data to \a file if it is possible.
+ */
+msg_error_t MSG_file_set_data(msg_file_t fd, void *data)
+{
+ SIMIX_file_set_data(fd->simdata->smx_file,data);
+
+ return MSG_OK;
+}
+
+/** \ingroup msg_file_management
+ *
+ * \brief Return the user data of a #msg_file_t.
+ *
+ * This functions checks whether \a file is a valid pointer or not and return
+ the user data associated to \a file if it is possible.
+ */
+void *MSG_file_get_data(msg_file_t fd)
+{
+ return SIMIX_file_get_data(fd->simdata->smx_file);
+}
+
/** \ingroup msg_file_management
* \brief Display information related to a file descriptor
*
*
* \return An #msg_file_t associated to the file
*/
-msg_file_t MSG_file_open(const char* mount, const char* fullname)
+msg_file_t MSG_file_open(const char* mount, const char* fullname, void* data)
{
msg_file_t file = xbt_new(s_msg_file_t,1);
file->fullname = xbt_strdup(fullname);
file->simdata = xbt_new0(s_simdata_file_t,1);
file->info = xbt_new0(s_file_info_t,1);
file->simdata->smx_file = simcall_file_open(mount, fullname);
+ SIMIX_file_set_data(file->simdata->smx_file, data);
+
return file;
}
"Logging specific to SIMIX (io)");
+void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd){
+ return SIMIX_file_get_data(fd);
+}
+
+void* SIMIX_file_get_data(smx_file_t fd){
+ xbt_assert((fd != NULL), "Invalid parameters (simix file is NULL)");
+
+ return fd->data;
+}
+
+void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data) {
+ SIMIX_file_set_data(fd, data);
+}
+
+void SIMIX_file_set_data(smx_file_t fd, void *data){
+ xbt_assert((fd != NULL), "Invalid parameter");
+
+ fd->data = data;
+}
+
//SIMIX FILE READ
void SIMIX_pre_file_read(smx_simcall_t simcall, size_t size,
smx_file_t fd)
#include "simgrid/simix.h"
#include "smx_smurf_private.h"
+void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd);
+void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data);
void SIMIX_pre_file_read(smx_simcall_t simcall, size_t size, smx_file_t fd);
void SIMIX_pre_file_write(smx_simcall_t simcall, size_t size, smx_file_t fd);
void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd);
+void* SIMIX_file_get_data(smx_file_t fd);
+void SIMIX_file_set_data(smx_file_t fd, void *data);
smx_action_t SIMIX_file_read(smx_process_t process, size_t size,
smx_file_t fd);
smx_action_t SIMIX_file_write(smx_process_t process, size_t size,
/* ******************************** File ************************************ */
typedef struct s_smx_file {
surf_file_t surf_file;
+ void* data; /**< @brief user data */
} s_smx_file_t;
/* ******************************** Storage ************************************ */
ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \
ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
+ACTION(SIMCALL_FILE_GET_DATA, file_get_data, WITH_ANSWER, TPTR(result), TSPEC(fd, smx_file_t)) sep \
+ACTION(SIMCALL_FILE_SET_DATA, file_set_data, WITH_ANSWER, TVOID(result), TSPEC(fd, smx_file_t), TPTR(data)) sep \
ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TSIZE(result), TSIZE(size), TSPEC(fd, smx_file_t)) sep \
ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TSIZE(size), TSPEC(fd, smx_file_t)) sep \
ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path)) sep \
return simcall_BODY_sem_get_capacity(sem);
}
+/**
+ * \ingroup simix_file_management
+ * \brief Returns the user data associated to a file.
+ *
+ * \param fd A simix file
+ * \return the user data of this file
+ */
+void* simcall_file_get_data(smx_file_t fd)
+{
+ return simcall_BODY_file_get_data(fd);
+}
+
+/**
+ * \ingroup simix_file_management
+ * \brief Sets the user data associated to a file.
+ *
+ * \param fd A SIMIX file
+ * \param data The user data to set
+ */
+void simcall_file_set_data(smx_file_t fd, void *data)
+{
+ simcall_file_set_data(fd, data);
+}
+
/**
* \ingroup simix_file_management
*