Tomato: fix for mask cache
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 9 Jul 2012 11:45:07 +0000 (11:45 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 9 Jul 2012 11:45:07 +0000 (11:45 +0000)
That used to be a threading issue when two different operations
were allowed to access the same mask's cache. Now use lock in
BKE_mask_rasterize_layers so that should work fine now.

source/blender/blenkernel/intern/mask.c

index a152fb900cfe3c6fdb914ceb99cf279150175b3b..072d10d35cb0ec7276c19fdc89eb88658432d3e1 100644 (file)
@@ -59,6 +59,9 @@
 #include "raskter.h"
 
 #ifdef USE_MANGO_MASK_CACHE_HACK
+
+#include "BLI_threads.h"
+
 typedef struct MaskRasterCache {
        float *buffer;
        int width, height;
@@ -2321,6 +2324,8 @@ void BKE_mask_rasterize_layers(Mask *mask, ListBase *masklayers, int width, int
        float *buffer_tmp;
 
 #ifdef USE_MANGO_MASK_CACHE_HACK
+       BLI_lock_thread(LOCK_CUSTOM1);
+
        if (cache &&
            cache->width == width &&
            cache->height == height &&
@@ -2330,10 +2335,13 @@ void BKE_mask_rasterize_layers(Mask *mask, ListBase *masklayers, int width, int
            mask_layers_compare(&cache->layers, &mask->masklayers))
        {
                memcpy(buffer, cache->buffer, sizeof(float) * buffer_size);
+
+               BLI_unlock_thread(LOCK_CUSTOM1);
+
                return;
        }
 
-       BKE_mask_raster_cache_free(mask);
+       BLI_unlock_thread(LOCK_CUSTOM1);
 #endif
 
        buffer_tmp = MEM_mallocN(sizeof(float) * buffer_size, __func__);
@@ -2462,6 +2470,10 @@ void BKE_mask_rasterize_layers(Mask *mask, ListBase *masklayers, int width, int
        MEM_freeN(buffer_tmp);
 
 #ifdef USE_MANGO_MASK_CACHE_HACK
+       BLI_lock_thread(LOCK_CUSTOM1);
+
+       BKE_mask_raster_cache_free(mask);
+
        cache = MEM_callocN(sizeof(MaskRasterCache), "mask raster cache");
 
        cache->buffer = MEM_mallocN(sizeof(float) * buffer_size, "mask raster cache buffer");
@@ -2477,6 +2489,8 @@ void BKE_mask_rasterize_layers(Mask *mask, ListBase *masklayers, int width, int
        cache->do_feather = do_feather;
 
        mask->raster_cache = cache;
+
+       BLI_unlock_thread(LOCK_CUSTOM1);
 #endif
 }