XBT_PUBLIC(sg_size_t) simcall_file_get_size(smx_file_t fd);
XBT_PUBLIC(xbt_dynar_t) simcall_file_get_info(smx_file_t fd);
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);
/***************************** 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);
surf_action_t surf_workstation_ls(surf_resource_t workstation, const char* mount, const char *path);
size_t surf_workstation_get_size(surf_resource_t workstation, surf_file_t fd);
size_t surf_workstation_file_tell(surf_resource_t workstation, surf_file_t fd);
+int surf_workstation_file_seek(surf_resource_t workstation, surf_file_t fd, sg_size_t offset, int origin);
int surf_network_link_is_shared(surf_cpp_resource_t link);
double surf_network_link_get_bandwidth(surf_cpp_resource_t link);
double surf_network_link_get_latency(surf_cpp_resource_t link);
*/
msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin)
{
- THROW_UNIMPLEMENTED;
- return MSG_OK;
+ //THROW_UNIMPLEMENTED;
+ return simcall_file_seek(fd->simdata->smx_file, offset, origin);
}
/*
return surf_workstation_get_info(host, fd->surf_file);
}
+int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin)
+{
+ return SIMIX_file_seek(simcall->issuer, fd, offset, origin);
+}
+
+int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin)
+{
+ smx_host_t host = process->smx_host;
+ return surf_workstation_file_seek(host, fd->surf_file, offset, origin);
+}
+
void SIMIX_pre_storage_file_rename(smx_simcall_t simcall, smx_storage_t storage, const char* src, const char* dest)
{
return SIMIX_storage_file_rename(simcall->issuer, storage, src, dest);
sg_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
sg_size_t SIMIX_pre_file_tell(smx_simcall_t simcall, smx_file_t fd);
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);
void SIMIX_pre_storage_file_rename(smx_simcall_t simcall,smx_storage_t storage, const char* src, const char* dest);
void* SIMIX_file_get_data(smx_file_t fd);
sg_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd);
sg_size_t SIMIX_file_tell(smx_process_t process, smx_file_t fd);
xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd);
-void SIMIX_storage_file_rename(smx_process_t process, smx_storage_t storage, const char* src, const char* dest);
+int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin);
+void SIMIX_storage_file_rename(smx_process_t process, smx_storage_t storage, const char* src, const char* dest);
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);
ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TDSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \
ACTION(SIMCALL_FILE_GET_SIZE, file_get_size, WITH_ANSWER, TSGSIZE(result), TDSPEC(fd, smx_file_t)) sep \
ACTION(SIMCALL_FILE_TELL, file_tell, WITH_ANSWER, TSGSIZE(result), TDSPEC(fd, smx_file_t)) sep \
+ACTION(SIMCALL_FILE_SEEK, file_seek, WITH_ANSWER, TINT(result), TDSPEC(fd, smx_file_t), TSGSIZE(offset), TINT(origin)) sep \
ACTION(SIMCALL_FILE_GET_INFO, file_get_info, WITH_ANSWER, TDSPEC(result, xbt_dynar_t), TDSPEC(fd, smx_file_t)) sep \
ACTION(SIMCALL_STORAGE_FILE_RENAME, storage_file_rename, WITH_ANSWER, TVOID(result), TDSPEC(storage, smx_storage_t), TSTRING(src), TSTRING(dest)) sep \
ACTION(SIMCALL_STORAGE_GET_FREE_SIZE, storage_get_free_size, WITH_ANSWER, TSGSIZE(result), TSTRING(name)) sep \
return simcall_BODY_file_get_info(fd);
}
+/**
+ * \ingroup simix_file_management
+ *
+ */
+int simcall_file_seek(smx_file_t fd, sg_size_t offset, int origin){
+ return simcall_BODY_file_seek(fd, offset, origin);
+}
+
/**
* \ingroup simix_file_management
*
}
size_t surf_workstation_file_tell(surf_resource_t workstation, surf_file_t fd){
- return get_casted_workstation(workstation)->getSize(fd);
+ return get_casted_workstation(workstation)->fileTell(fd);
+}
+
+int surf_workstation_file_seek(surf_resource_t workstation, surf_file_t fd, sg_size_t offset, int origin){
+ return get_casted_workstation(workstation)->fileSeek(fd, offset, origin);
}
xbt_dynar_t surf_workstation_get_vms(surf_resource_t resource){
return fd->current_position;
}
+sg_size_t WorkstationCLM03::fileSeek(surf_file_t fd, sg_size_t offset, int origin){
+
+ switch (origin) {
+ case SEEK_SET:
+ fd->current_position = 0;
+ return MSG_OK;
+ case SEEK_CUR:
+ if(offset > fd->size)
+ offset = fd->size;
+ fd->current_position = offset;
+ return MSG_OK;
+ case SEEK_END:
+ fd->current_position = fd->size;
+ return MSG_OK;
+ default:
+ return MSG_TASK_CANCELED;
+ }
+}
+
sg_size_t WorkstationCLM03::getFreeSize(const char* name)
{
StoragePtr st = findStorageOnMountList(name);
sg_size_t fileTell(surf_file_t fd);
sg_size_t getFreeSize(const char* name);
sg_size_t getUsedSize(const char* name);
+ sg_size_t fileSeek(surf_file_t fd, sg_size_t offset, int origin);
bool isUsed();
//bool isShared();