#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)
{
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);
{
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);
case CLOSE:
case STAT:
case UNLINK:
+ case LS:
break;
case READ:
lmm_expand(storage_maxmin_system, STORAGE->constraint_read,
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;
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) {