Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Another missing include, needed with tracing=off.
[simgrid.git] / src / surf / storage.c
index ace5d0a..5dd92c0 100644 (file)
@@ -36,8 +36,10 @@ static xbt_dynar_t storage_list;
 #define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
 
 static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size);
+static int storage_action_unref(surf_action_t action);
 static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state);
 static surf_action_t storage_action_execute (void *storage, double size, e_surf_action_storage_type_t type);
+static void free_storage_content(void *p);
 
 static surf_action_t storage_action_stat(void *storage, surf_file_t stream)
 {
@@ -47,6 +49,66 @@ static surf_action_t storage_action_stat(void *storage, surf_file_t stream)
   return action;
 }
 
+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();
+
+  char* key;
+  surf_stat_t data = NULL;
+  xbt_dict_cursor_t cursor = NULL;
+
+  xbt_dynar_t dyn = NULL;
+  char* file = NULL;
+
+  // foreach file int the storage
+  xbt_dict_foreach(((storage_t)storage)->content,cursor,key,data){
+    // Search if file start with the prefix 'path'
+    if(xbt_str_start_with(key,path)){
+      file = &key[strlen(path)];
+
+      // Split file with '/'
+      dyn = xbt_str_split(file,"/");
+      file = xbt_dynar_get_as(dyn,0,char*);
+
+      // file
+      if(xbt_dynar_length(dyn) == 1){
+        xbt_dict_set(ls_dict,file,&(data->stat),NULL);
+      }
+      // Directory
+      else
+      {
+        // if directory does not exist yet in dict
+        if(!xbt_dict_get_or_null(ls_dict,file))
+          xbt_dict_set(ls_dict,file,NULL,NULL);
+      }
+      xbt_dynar_free(&dyn);
+    }
+  }
+
+  action->ls_dict = ls_dict;
+  return action;
+}
+
+static surf_action_t storage_action_unlink(void *storage, surf_file_t stream)
+{
+  surf_action_t action = storage_action_execute(storage,0, UNLINK);
+
+  // Add memory to storage
+  ((storage_t)storage)->used_size -= stream->content->stat.size;
+
+  // Remove the file from storage
+  xbt_dict_t content_dict = ((storage_t)storage)->content;
+  xbt_dict_remove(content_dict,stream->name);
+
+  free(stream->name);
+  stream->content = NULL;
+  xbt_free(stream);
+
+  return action;
+}
+
 static surf_action_t storage_action_open(void *storage, const char* mount, const char* path, const char* mode)
 {
   XBT_DEBUG("\tOpen file '%s'",path);
@@ -79,6 +141,16 @@ static surf_action_t storage_action_close(void *storage, surf_file_t fp)
 {
   char *filename = fp->name;
   XBT_DEBUG("\tClose file '%s' size '%f'",filename,fp->content->stat.size);
+  // unref write actions from storage
+  surf_action_storage_t write_action;
+  unsigned int i;
+  xbt_dynar_foreach(((storage_t)storage)->write_actions,i,write_action) {
+    if ((write_action->generic_lmm_action.generic_action.file) == fp) {
+      xbt_dynar_cursor_rm(((storage_t)storage)->write_actions, &i);
+      storage_action_unref((surf_action_t) write_action);
+    }
+  }
+
   free(fp->name);
   fp->content = NULL;
   xbt_free(fp);
@@ -137,6 +209,8 @@ static surf_action_t storage_action_execute (void *storage, double size, e_surf_
   case OPEN:
   case CLOSE:
   case STAT:
+  case UNLINK:
+  case LS:
     break;
   case READ:
     lmm_expand(storage_maxmin_system, STORAGE->constraint_read,
@@ -146,7 +220,7 @@ static surf_action_t storage_action_execute (void *storage, double size, e_surf_
     lmm_expand(storage_maxmin_system, STORAGE->constraint_write,
                GENERIC_LMM_ACTION(action).variable, 1.0);
     xbt_dynar_push(((storage_t)storage)->write_actions,&action);
-
+    surf_action_ref((surf_action_t) action);
     break;
   }
   action->type = type;
@@ -189,7 +263,7 @@ static void* storage_create_resource(const char* id, const char* model,const cha
       storage_type->properties,
       Bread);
 
-  if(!storage_list) storage_list=xbt_dynar_new(sizeof(char *),free);
+  if(!storage_list) storage_list=xbt_dynar_new(sizeof(char *),NULL);
   xbt_dynar_push(storage_list,&storage);
 
   return storage;
@@ -203,6 +277,9 @@ static void storage_finalize(void)
   surf_model_exit(surf_storage_model);
   surf_storage_model = NULL;
 
+  if(storage_list)
+    xbt_dynar_free(&storage_list);
+
   xbt_swag_free
       (storage_running_action_set_that_does_not_need_being_checked);
   storage_running_action_set_that_does_not_need_being_checked = NULL;
@@ -439,6 +516,8 @@ static void surf_storage_model_init_internal(void)
   surf_storage_model->extension.storage.read = storage_action_read;
   surf_storage_model->extension.storage.write = storage_action_write;
   surf_storage_model->extension.storage.stat = storage_action_stat;
+  surf_storage_model->extension.storage.unlink = storage_action_unlink;
+  surf_storage_model->extension.storage.ls = storage_action_ls;
   surf_storage_model->extension.storage.create_resource = storage_create_resource;
 
   if (!storage_maxmin_system) {
@@ -620,6 +699,7 @@ static XBT_INLINE void surf_storage_resource_free(void *r)
   // specific to storage
   storage_t storage = r;
   xbt_dict_free(&storage->content);
+  xbt_dynar_free(&storage->write_actions);
   // generic resource
   surf_resource_free(r);
 }