Movie cache: add function to iterate through cache and remove items
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 8 Aug 2012 12:16:46 +0000 (12:16 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 8 Aug 2012 12:16:46 +0000 (12:16 +0000)
using custom check function for this.

Currently unused, but would be helpful for sequencer cache.

source/blender/imbuf/IMB_moviecache.h
source/blender/imbuf/intern/moviecache.c

index 5e52563a89e78aa400a8833125c36ce1521be5b5..00d3368ae5f6af8324d1d4bc8b0c2630b45adf33 100644 (file)
@@ -60,6 +60,9 @@ void IMB_moviecache_set_priority_callback(struct MovieCache *cache, MovieCacheGe
 void IMB_moviecache_put(struct MovieCache *cache, void *userkey, struct ImBuf *ibuf);
 struct ImBuf* IMB_moviecache_get(struct MovieCache *cache, void *userkey);
 void IMB_moviecache_free(struct MovieCache *cache);
+
+void IMB_moviecache_cleanup(struct MovieCache *cache, int (cleanup_check_cb) (void *userkey, void *userdata), void *userdata);
+
 void IMB_moviecache_get_cache_segments(struct MovieCache *cache, int proxy, int render_flags, int *totseg_r, int **points_r);
 
 #endif
index 671c79a0659688e182fd27319b5d82d74f27478e..71eae6c6c21097d378cb705fec6a6f2bcec9d36b 100644 (file)
@@ -393,6 +393,32 @@ void IMB_moviecache_free(MovieCache *cache)
        MEM_freeN(cache);
 }
 
+void IMB_moviecache_cleanup(MovieCache *cache, int (cleanup_check_cb) (void *userkey, void *userdata), void *userdata)
+{
+       GHashIterator *iter;
+
+       iter = BLI_ghashIterator_new(cache->hash);
+       while (!BLI_ghashIterator_isDone(iter)) {
+               MovieCacheKey *key = BLI_ghashIterator_getKey(iter);
+               int remove;
+
+               BLI_ghashIterator_step(iter);
+
+               remove = cleanup_check_cb(key->userkey, userdata);
+
+               if (remove) {
+                       MovieCacheItem *item = BLI_ghashIterator_getValue(iter);
+                       (void) item;  /* silence unused variable when not using debug */
+
+                       PRINT("%s: cache '%s' remove item %p\n", __func__, cache->name, item);
+
+                       BLI_ghash_remove(cache->hash, key, moviecache_keyfree, moviecache_valfree);
+               }
+       }
+
+       BLI_ghashIterator_free(iter);
+}
+
 /* get segments of cached frames. useful for debugging cache policies */
 void IMB_moviecache_get_cache_segments(MovieCache *cache, int proxy, int render_flags, int *totseg_r, int **points_r)
 {