X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fdc1a282a7200e7131298083d6dd41f6aa8beb89..a246b2d82b1adcd5f8fbaa5791b660d331d7209a:/src/surf/storage.c diff --git a/src/surf/storage.c b/src/surf/storage.c index c36d8e68b4..447c3c6ffa 100644 --- a/src/surf/storage.c +++ b/src/surf/storage.c @@ -44,7 +44,7 @@ static surf_action_t storage_action_ls(void *storage, const char* path) { surf_action_t action = storage_action_execute(storage,0, LS); action->ls_dict = NULL; - xbt_dict_t ls_dict = xbt_dict_new_homogeneous(NULL); + xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free); char* key; sg_storage_size_t size = 0; @@ -65,7 +65,9 @@ static surf_action_t storage_action_ls(void *storage, const char* path) // file if(xbt_dynar_length(dyn) == 1){ - xbt_dict_set(ls_dict,file,&size,NULL); + sg_storage_size_t *psize = xbt_new(sg_storage_size_t,1); + *psize=size; + xbt_dict_set(ls_dict,file,psize,NULL); } // Directory else @@ -87,12 +89,16 @@ static surf_action_t storage_action_open(void *storage, const char* mount, { XBT_DEBUG("\tOpen file '%s'",path); xbt_dict_t content_dict = ((storage_t)storage)->content; - sg_storage_size_t size = (sg_storage_size_t) xbt_dict_get_or_null(content_dict,path); - + sg_storage_size_t size, *psize; + psize = (sg_storage_size_t*) xbt_dict_get_or_null(content_dict, path); + if (psize) + size = *psize; + else { // if file does not exist create an empty file - if(!size){ - size = 0; - xbt_dict_set(content_dict,path,&size,NULL); + psize = xbt_new(sg_storage_size_t,1); + size = 0; + *psize = size; + xbt_dict_set(content_dict,path,psize,NULL); XBT_DEBUG("File '%s' was not found, file created.",path); } surf_file_t file = xbt_new0(s_surf_file_t,1); @@ -203,17 +209,39 @@ static xbt_dict_t storage_get_content(void *storage) /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */ /*surf_action_t action = storage_action_execute(storage,0, LS);*/ - void *st = surf_storage_resource_priv(storage); + void *storage_resource = surf_storage_resource_priv(storage); xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL); xbt_dict_cursor_t cursor = NULL; char *file; - char *size; - xbt_dict_foreach(((storage_t)st)->content, cursor, file, size){ - xbt_dict_set(content_dict,file,(void*)size,NULL); + sg_storage_size_t *psize; + + xbt_dict_foreach(((storage_t)storage_resource)->content, cursor, file, psize){ + xbt_dict_set(content_dict,file,psize,NULL); } return content_dict; } +static sg_storage_size_t storage_get_size(void *storage){ + void *storage_resource = surf_storage_resource_priv(storage); + return ((storage_t)storage_resource)->size; +} + +static void storage_file_rename(void *storage, const char *src, const char *dest) +{ + void *storage_resource = surf_storage_resource_priv(storage); + + sg_storage_size_t *psize; + psize = (sg_storage_size_t*) xbt_dict_get_or_null(((storage_t)storage_resource)->content,src); + if (psize){// src file exists + xbt_dict_remove(((storage_t)storage_resource)->content, src); + xbt_dict_set(((storage_t)storage_resource)->content, dest, psize,NULL); + XBT_DEBUG("Change file name from %s to %s, size '%" PRIu64 "'",src, dest, *psize); + } + else + XBT_DEBUG("File %s doesn't exist",src); +} + + static void* storage_create_resource(const char* id, const char* model, const char* type_id, const char* content_name, const char* content_type, xbt_dict_t properties){ storage_t storage = NULL; @@ -297,8 +325,11 @@ static void storage_update_actions_state(double now, double delta) ((storage_t)(action->storage))->used_size += incr; // disk usage ((surf_action_t)action)->file->size += incr; // file size + sg_storage_size_t *psize = xbt_new(sg_storage_size_t,1); + *psize = ((surf_action_t)action)->file->size; + xbt_dict_t content_dict = ((storage_t)(action->storage))->content; - xbt_dict_set(content_dict,((surf_action_t)action)->file->name,(void*)(((surf_action_t)action)->file->size),NULL); + xbt_dict_set(content_dict,((surf_action_t)action)->file->name,psize,NULL); } double_update(&(GENERIC_ACTION(action).remains), @@ -522,11 +553,11 @@ static void surf_storage_model_init_internal(void) surf_storage_model->extension.storage.ls = storage_action_ls; surf_storage_model->extension.storage.get_properties = storage_get_properties; surf_storage_model->extension.storage.get_content = storage_get_content; - + surf_storage_model->extension.storage.get_size = storage_get_size; + surf_storage_model->extension.storage.rename = storage_file_rename; if (!storage_maxmin_system) { storage_maxmin_system = lmm_system_new(storage_selective_update); } - } void surf_storage_model_init_default(void) @@ -565,7 +596,7 @@ static xbt_dict_t parse_storage_content(char *filename, sg_storage_size_t *used_ if ((!filename) || (strcmp(filename, "") == 0)) return NULL; - xbt_dict_t parse_content = xbt_dict_new_homogeneous(NULL); + xbt_dict_t parse_content = xbt_dict_new_homogeneous(xbt_free); FILE *file = NULL; file = surf_fopen(filename, "r"); @@ -582,7 +613,9 @@ static xbt_dict_t parse_storage_content(char *filename, sg_storage_size_t *used_ if (read){ if (sscanf(line,"%s %" SCNu64, path, &size) == 2) { *used_size += size; - xbt_dict_set(parse_content,path,(void*) size,NULL); + sg_storage_size_t *psize = xbt_new(sg_storage_size_t, 1); + *psize = size; + xbt_dict_set(parse_content,path,psize,NULL); } else { xbt_die("Be sure of passing a good format for content file.\n"); }