Commit: 2842949e13dbb8aba116d48d984fadd86bfa4392
Author: Bastien Montagne
Date:   Mon Apr 13 21:54:37 2015 +0200
Branches: asset-experiments
https://developer.blender.org/rB2842949e13dbb8aba116d48d984fadd86bfa4392

Add uuids ghash to filelist's cache.

===================================================================

M       source/blender/editors/space_file/filelist.c
M       source/blender/makesdna/DNA_space_types.h

===================================================================

diff --git a/source/blender/editors/space_file/filelist.c 
b/source/blender/editors/space_file/filelist.c
index 6c827f4..f675c96 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -237,6 +237,9 @@ typedef struct FileListEntryCache {
        int misc_entries_indices[FILELIST_ENTRYCACHESIZE];
        GHash *misc_entries;
 
+       /* Allows to quickly get a cached entry from its UUID. */
+       GHash *uuids;
+
        /* Previews handling. */
        TaskPool *previews_pool;
        ThreadQueue *previews_todo;
@@ -1167,6 +1170,10 @@ static void filelist_cache_init(FileListEntryCache 
*cache)
        cache->misc_entries = BLI_ghash_ptr_new_ex(__func__, 
FILELIST_ENTRYCACHESIZE);
        fill_vn_i(cache->misc_entries_indices, 
ARRAY_SIZE(cache->misc_entries_indices), -1);
        cache->misc_cursor = 0;
+
+       /* XXX This assumes uint is 32 bits and uuid is 128 bits (char[16]), be 
careful! */
+       cache->uuids = BLI_ghash_new_ex(BLI_ghashutil_uinthash_v4, 
BLI_ghashutil_uinthash_v4_cmp,
+                                       __func__, FILELIST_ENTRYCACHESIZE * 2);
 }
 
 static void filelist_cache_free(FileListEntryCache *cache)
@@ -1178,6 +1185,11 @@ static void filelist_cache_free(FileListEntryCache 
*cache)
                BLI_ghash_free(cache->misc_entries, NULL, NULL);
                cache->misc_entries = NULL;
        }
+
+       if (cache->uuids) {
+               BLI_ghash_free(cache->uuids, NULL, NULL);
+               cache->uuids = NULL;
+       }
 }
 
 static void filelist_cache_clear(FileListEntryCache *cache)
@@ -1190,6 +1202,10 @@ static void filelist_cache_clear(FileListEntryCache 
*cache)
        if (cache->misc_entries) {
                BLI_ghash_clear_ex(cache->misc_entries, NULL, NULL, 
FILELIST_ENTRYCACHESIZE);
        }
+
+       if (cache->uuids) {
+               BLI_ghash_clear_ex(cache->uuids, NULL, NULL, 
FILELIST_ENTRYCACHESIZE * 2);
+       }
 }
 
 FileList *filelist_new(short type)
@@ -1424,9 +1440,12 @@ static FileDirEntry *filelist_file_ex(struct FileList 
*filelist, const int index
        ret = filelist_file_create_entry(filelist, index);
        old_index = cache->misc_entries_indices[cache->misc_cursor];
        if ((old = BLI_ghash_popkey(cache->misc_entries, 
SET_INT_IN_POINTER(old_index), NULL))) {
+               BLI_ghash_remove(cache->uuids, old->uuid, NULL, NULL);
                filelist_file_release_entry(filelist, old);
        }
        BLI_ghash_insert(cache->misc_entries, SET_INT_IN_POINTER(index), ret);
+       BLI_ghash_insert(cache->uuids, ret->uuid, ret);
+
        cache->misc_entries_indices[cache->misc_cursor] = index;
        cache->misc_cursor = (cache->misc_cursor + 1) % FILELIST_ENTRYCACHESIZE;
 
@@ -1453,7 +1472,7 @@ int filelist_file_findpath(struct FileList *filelist, 
const char *filename)
        }
 
        /* XXX TODO Cache could probably use a ghash on paths too? Not really 
urgent though.
-     *          In fact, we may get rid of this func in the end (only used to 
find again renamed entry afaik). */
+     *          This is only used to find again renamed entry, annoying but 
looks hairy to get rid of it currently. */
 
        for (fidx = 0; fidx < filelist->filelist.nbr_entries_filtered; fidx++) {
                FileListInternEntry *entry = 
filelist->filelist_intern.filtered[fidx];
@@ -1467,18 +1486,25 @@ int filelist_file_findpath(struct FileList *filelist, 
const char *filename)
 
 FileDirEntry *filelist_entry_find_uuid(struct FileList *filelist, const char 
uuid[ASSET_UUID_LENGTH])
 {
-       int fidx;
-
        if (filelist->filelist.nbr_entries_filtered < 0) {
                return NULL;
        }
 
-       /* XXX TODO Cache could probably use a ghash on uuids too? Not really 
urgent though. */
+       if (filelist->filelist_cache.uuids) {
+               FileDirEntry *entry = 
BLI_ghash_lookup(filelist->filelist_cache.uuids, uuid);
+               if (entry) {
+                       return entry;
+               }
+       }
 
-       for (fidx = 0; fidx < filelist->filelist.nbr_entries_filtered; fidx++) {
-               FileListInternEntry *entry = 
filelist->filelist_intern.filtered[fidx];
-               if (memcmp(entry->uuid, uuid, sizeof(entry->uuid)) == 0) {
-                       return filelist_file(filelist, fidx);
+       {
+               int fidx;
+
+               for (fidx = 0; fidx < filelist->filelist.nbr_entries_filtered; 
fidx++) {
+                       FileListInternEntry *entry = 
filelist->filelist_intern.filtered[fidx];
+                       if (memcmp(entry->uuid, uuid, sizeof(entry->uuid)) == 
0) {
+                               return filelist_file(filelist, fidx);
+                       }
                }
        }
 
@@ -1494,7 +1520,9 @@ static bool filelist_file_cache_block_create(struct 
FileList *filelist, const in
                int i, idx;
 
                for (i = 0, idx = start_index; i < size; i++, idx++, cursor++) {
-                       cache->block_entries[cursor] = 
filelist_file_create_entry(filelist, idx);
+                       FileDirEntry *entry = 
filelist_file_create_entry(filelist, idx);
+                       cache->block_entries[cursor] = entry;
+                       BLI_ghash_insert(cache->uuids, entry->uuid, entry);
                }
                return true;
        }
@@ -1510,8 +1538,10 @@ static void filelist_file_cache_block_release(struct 
FileList *filelist, const i
                int i;
 
                for (i = 0; i < size; i++, cursor++) {
+                       FileDirEntry *entry = cache->block_entries[cursor];
 //                     printf("%s: release cacheidx %d (%%p %%s)\n", __func__, 
cursor/*, cache->block_entries[cursor], 
cache->block_entries[cursor]->relpath*/);
-                       filelist_file_release_entry(filelist, 
cache->block_entries[cursor]);
+                       BLI_ghash_remove(cache->uuids, entry->uuid, NULL, NULL);
+                       filelist_file_release_entry(filelist, entry);
 #ifndef NDEBUG
                        cache->block_entries[cursor] = NULL;
 #endif
diff --git a/source/blender/makesdna/DNA_space_types.h 
b/source/blender/makesdna/DNA_space_types.h
index 665a734..425eb69 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -743,7 +743,10 @@ typedef enum eDirEntry_SelectFlag {
 
 /* ***** Related to file browser, but never saved in DNA, only here to help 
with RNA. ***** */
 
-/* For RNA only, used to communicate with asset engines outside of 'import' 
context. */
+/* Be careful, we assume uuid is 128 bits (char[16]) in a few places, like 
uuids ghash in filecache of filebrowser. */
+#define ASSET_UUID_LENGTH     16
+
+/* Used to communicate with asset engines outside of 'import' context. */
 typedef struct AssetUUID {
        char uuid_asset[16];     /* ASSET_UUID_LENGTH */
        char uuid_variant[16];   /* ASSET_UUID_LENGTH */
@@ -852,8 +855,6 @@ typedef struct FileDirEntryArr {
        char root[1024];         /* FILE_MAX */
 } FileDirEntryArr;
 
-#define ASSET_UUID_LENGTH     16
-
 enum {
        ASSET_STATUS_LOCAL  = 1 << 0,  /* If active uuid is available 
localy/immediately. */
        ASSET_STATUS_LATEST = 1 << 1,  /* If active uuid is latest available 
version. */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to