Revision: 50126
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50126
Author:   nazgul
Date:     2012-08-22 15:13:14 +0000 (Wed, 22 Aug 2012)
Log Message:
-----------
Movie cache: made it thread safe to operate with memory limitor

Movie cache is using global memory limitor, which isn't thread safe
in some of operations, so it required to add mutex around limitor
operations in movie cache.

It's probably could be solved in a way with less locks involved
bu using different limitor for different areas (like use own limitor
for clips, own limitor for sequencer and so), but that wouldn't be
so easy to control overall memory usage.

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/imbuf/intern/moviecache.c

Modified: branches/soc-2011-tomato/source/blender/imbuf/intern/moviecache.c
===================================================================
--- branches/soc-2011-tomato/source/blender/imbuf/intern/moviecache.c   
2012-08-22 15:10:07 UTC (rev 50125)
+++ branches/soc-2011-tomato/source/blender/imbuf/intern/moviecache.c   
2012-08-22 15:13:14 UTC (rev 50126)
@@ -41,6 +41,7 @@
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 #include "BLI_mempool.h"
+#include "BLI_threads.h"
 
 #include "IMB_moviecache.h"
 
@@ -58,6 +59,7 @@
 #endif
 
 static MEM_CacheLimiterC *limitor = NULL;
+static pthread_mutex_t limitor_lock = BLI_MUTEX_INITIALIZER;
 
 typedef struct MovieCache {
        char name[64];
@@ -334,16 +336,20 @@
        BLI_ghash_remove(cache->hash, key, moviecache_keyfree, 
moviecache_valfree);
        BLI_ghash_insert(cache->hash, key, item);
 
-       item->c_handle = MEM_CacheLimiter_insert(limitor, item);
-
        if (cache->last_userkey) {
                memcpy(cache->last_userkey, userkey, cache->keysize);
        }
 
+       BLI_mutex_lock(&limitor_lock);
+
+       item->c_handle = MEM_CacheLimiter_insert(limitor, item);
+
        MEM_CacheLimiter_ref(item->c_handle);
        MEM_CacheLimiter_enforce_limits(limitor);
        MEM_CacheLimiter_unref(item->c_handle);
 
+       BLI_mutex_unlock(&limitor_lock);
+
        /* cache limiter can't remove unused keys which points to destoryed 
values */
        check_unused_keys(cache);
 
@@ -364,7 +370,10 @@
 
        if (item) {
                if (item->ibuf) {
+                       BLI_mutex_lock(&limitor_lock);
                        MEM_CacheLimiter_touch(item->c_handle);
+                       BLI_mutex_unlock(&limitor_lock);
+
                        IMB_refImBuf(item->ibuf);
 
                        return item->ibuf;

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

Reply via email to