XBT_PUBLIC(void) __MSG_file_priv_free(msg_file_priv_t priv);
XBT_PUBLIC(const char *) MSG_file_get_name(msg_file_t storage);
XBT_PUBLIC(msg_error_t) MSG_file_move(msg_file_t fd, const char* fullpath);
+XBT_PUBLIC(msg_error_t) MSG_file_rcopy(msg_file_t fd, msg_host_t host, const char* fullpath);
/************************** Storage handling ***********************************/
XBT_PUBLIC(msg_host_t) MSG_get_storage_by_name(const char *name);
XBT_PUBLIC(const char *) MSG_storage_get_name(msg_storage_t storage);
XBT_PUBLIC(sg_size_t) simcall_file_tell(smx_file_t fd);
XBT_PUBLIC(int) simcall_file_seek(smx_file_t fd, sg_size_t offset, int origin);
XBT_PUBLIC(int) simcall_file_move(smx_file_t fd, const char* fullpath);
+XBT_PUBLIC(int) simcall_file_rcopy(smx_file_t fd, smx_host_t host, const char* fullpath);
/***************************** Storage **********************************/
XBT_PUBLIC(sg_size_t) simcall_storage_get_free_size (const char* name);
XBT_PUBLIC(sg_size_t) simcall_storage_get_used_size (const char* name);
* @param workstation The surf workstation
* @param fd The file descriptor
* @param fullpath The new full path
- * @param origin Position used as a reference for the offset
*
* @return MSG_OK if successful, otherwise MSG_TASK_CANCELED
*/
*/
XBT_PUBLIC(int) surf_workstation_file_seek(surf_resource_t workstation, surf_file_t fd, sg_size_t offset, int origin);
+/**
+ * @brief Copy a file to another location on a remote host.
+ * @details [long description]
+ *
+ * @param workstation The surf workstation
+ * @param fd The file descriptor
+ * @param host_dest The workstation destination
+ * @param fullpath The new full path
+ *
+ * @return MSG_OK if successful, otherwise MSG_TASK_CANCELED
+ */
+XBT_PUBLIC(int) surf_workstation_file_rcopy(surf_resource_t workstation, surf_file_t fd, surf_resource_t host_dest, const char* fullpath);
/**
* @brief [brief description]
return simcall_file_move(priv->simdata->smx_file, fullpath);
}
+/**
+ * \ingroup msg_file_management
+ * \brief Move a file to another location on a remote host.
+ * \param fd : the file to move
+ * \param host : the remote host where the file has to be moved
+ * \param fullpath : the complete path destination on the remote host
+ * \return If successful, the function returns MSG_OK. Otherwise, it returns
+ * MSG_TASK_CANCELED.
+ */
+msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpath)
+{
+ msg_file_priv_t file_priv = MSG_file_priv(file);
+ return simcall_file_rcopy(file_priv->simdata->smx_file, host, fullpath);
+}
+
+
/**
* \brief Destroys a file (internal call only)
*/
file_seek True (int) (fd, void*, smx_file_t) (offset, sg_size_t) (origin, int)
file_get_info True (void*, xbt_dynar_t) (fd, void*, smx_file_t)
file_move True (int) (fd, void*, smx_file_t) (fullpath, const char*)
+file_rcopy True (int) (fd, void*, smx_file_t) (host, void*, smx_host_t) (fullpath, const char*)
storage_get_free_size True (sg_size_t) (name, const char*)
storage_get_used_size True (sg_size_t) (name, const char*)
storage_get_properties True (void*, xbt_dict_t) (storage, void*, smx_storage_t)
static inline void simcall_file_move__set__fullpath(smx_simcall_t simcall, const char* arg){
simcall->args[1].cc = arg;
}
+static inline smx_file_t simcall_file_rcopy__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_rcopy__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_file_rcopy__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_file_rcopy__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline const char* simcall_file_rcopy__get__fullpath(smx_simcall_t simcall){
+ return simcall->args[2].cc;
+}
+static inline void simcall_file_rcopy__set__fullpath(smx_simcall_t simcall, const char* arg){
+ simcall->args[2].cc = arg;
+}
static inline const char* simcall_storage_get_free_size__get__name(smx_simcall_t simcall){
return simcall->args[0].cc;
}
}
return self->simcall.result.i;
}
+ inline static int simcall_BODY_file_rcopy(smx_file_t fd, smx_host_t host, const char* fullpath) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_RCOPY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ self->simcall.args[1].dp = (void*) host;
+ self->simcall.args[2].cc = (const char*) fullpath;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
inline static sg_size_t simcall_BODY_storage_get_free_size(const char* name) {
smx_process_t self = SIMIX_process_self();
self->simcall.call = SIMCALL_STORAGE_GET_FREE_SIZE;
SIMIX_simcall_answer(simcall);
break;
+case SIMCALL_FILE_RCOPY:
+ simcall->result.i = SIMIX_pre_file_rcopy(simcall , (smx_file_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp, simcall->args[2].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
case SIMCALL_STORAGE_GET_FREE_SIZE:
simcall->result.sgsz = SIMIX_pre_storage_get_free_size(simcall , simcall->args[0].cc);
SIMIX_simcall_answer(simcall);
SIMCALL_FILE_SEEK,
SIMCALL_FILE_GET_INFO,
SIMCALL_FILE_MOVE,
+SIMCALL_FILE_RCOPY,
SIMCALL_STORAGE_GET_FREE_SIZE,
SIMCALL_STORAGE_GET_USED_SIZE,
SIMCALL_STORAGE_GET_PROPERTIES,
static inline void simcall_file_move__set__result(smx_simcall_t simcall, int result){
simcall->result.i = result;
}
+static inline int simcall_file_rcopy__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_file_rcopy__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
static inline sg_size_t simcall_storage_get_free_size__get__result(smx_simcall_t simcall){
return simcall->result.sgsz;
}
[SIMCALL_FILE_SEEK] = "SIMCALL_FILE_SEEK",
[SIMCALL_FILE_GET_INFO] = "SIMCALL_FILE_GET_INFO",
[SIMCALL_FILE_MOVE] = "SIMCALL_FILE_MOVE",
+[SIMCALL_FILE_RCOPY] = "SIMCALL_FILE_RCOPY",
[SIMCALL_STORAGE_GET_FREE_SIZE] = "SIMCALL_STORAGE_GET_FREE_SIZE",
[SIMCALL_STORAGE_GET_USED_SIZE] = "SIMCALL_STORAGE_GET_USED_SIZE",
[SIMCALL_STORAGE_GET_PROPERTIES] = "SIMCALL_STORAGE_GET_PROPERTIES",
return surf_workstation_file_move(host, file->surf_file, fullpath);
}
+int SIMIX_pre_file_rcopy(smx_simcall_t simcall, smx_file_t fd, smx_host_t host, const char* fullpath)
+{
+ return SIMIX_file_rcopy(simcall->issuer, fd, host, fullpath);
+}
+
+int SIMIX_file_rcopy(smx_process_t process, smx_file_t file, smx_host_t host_dest, const char* fullpath)
+{
+ smx_host_t host = process->smx_host;
+ return surf_workstation_file_rcopy(host, file->surf_file, host_dest, fullpath);
+}
+
sg_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall, const char* name)
{
return SIMIX_storage_get_free_size(simcall->issuer, name);
xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd);
int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin);
int SIMIX_pre_file_move(smx_simcall_t simcall, smx_file_t fd, const char* fullpath);
+int SIMIX_pre_file_rcopy(smx_simcall_t simcall, smx_file_t fd, smx_host_t dest, const char* fullpath);
smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size);
smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size);
smx_action_t SIMIX_file_open(smx_process_t process, const char* fullpath);
xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd);
int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin);
int SIMIX_file_move(smx_process_t process, smx_file_t fd, const char* fullpath);
+int SIMIX_file_rcopy(smx_process_t process, smx_file_t fd, smx_host_t dest, const char* fullpath);
sg_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall,const char* name);
sg_size_t SIMIX_storage_get_free_size(smx_process_t process,const char* name);
return simcall_BODY_file_move(fd, fullpath);
}
+/**
+ * \ingroup simix_file_management
+ * \brief Copy a file to another location on a remote host.
+ *
+ */
+int simcall_file_rcopy(smx_file_t fd, smx_host_t host, const char* fullpath)
+{
+ return simcall_BODY_file_rcopy(fd, host, fullpath);
+}
+
/**
* \ingroup simix_storage_management
* \brief Returns the free space size on a given storage element.
return get_casted_workstation(workstation)->fileMove(fd, fullpath);
}
+int surf_workstation_file_rcopy(surf_resource_t workstation, surf_file_t fd, surf_resource_t host_dest, const char* fullpath){
+ return get_casted_workstation(workstation)->fileRcopy(fd, host_dest, fullpath);
+}
+
xbt_dynar_t surf_workstation_get_vms(surf_resource_t resource){
return get_casted_workstation(resource)->getVms();
}
*/
virtual int fileMove(surf_file_t fd, const char* fullpath);
+ /**
+ * @brief Copy a file to another location on a remote host.
+ * @details [long description]
+ *
+ * @param fd The file descriptor
+ * @param host_dest The worstation destination
+ * @param fullpath The new full path
+ * @return MSG_OK if successful, otherwise MSG_TASK_CANCELED
+ */
+ virtual int fileRcopy(surf_file_t fd, surf_resource_t host_dest, const char* fullpath);
+
xbt_dynar_t p_storage;
RoutingEdgePtr p_netElm;
CpuPtr p_cpu;