Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-04-01 11:14:37 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-04-01 11:14:37 +0400
commitee72cba008829c0ae1bb21f952e180d54dd12f88 (patch)
tree7bef5e2f9cf64b82615af0e6aab4ba7ff0d1f60d /source/blender
parente95fd792582324bd93077358e0393e78273a76d3 (diff)
Fix T39446: Blender Crashes when Camera Tracking
Issue is likely caused by thread-unsafe nature of IMB_freeImBuf which might lead to race condition in some circumstances. Now made it thread-safe and from Sebastian's tests seems crash is gone now, so hopefully the root of the issue is finally nailed down.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/imbuf/intern/IMB_allocimbuf.h3
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c23
-rw-r--r--source/blender/imbuf/intern/module.c6
3 files changed, 32 insertions, 0 deletions
diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h
index 02b738cc2cd..f4d6d869f1b 100644
--- a/source/blender/imbuf/intern/IMB_allocimbuf.h
+++ b/source/blender/imbuf/intern/IMB_allocimbuf.h
@@ -35,6 +35,9 @@
struct ImBuf;
+void imb_refcounter_lock_init(void);
+void imb_refcounter_lock_exit(void);
+
bool imb_addencodedbufferImBuf(struct ImBuf *ibuf);
bool imb_enlargeencodedbufferImBuf(struct ImBuf *ibuf);
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index d7ca381bae6..d0e81f2f383 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -49,6 +49,19 @@
#include "MEM_CacheLimiterC-Api.h"
#include "BLI_utildefines.h"
+#include "BLI_threads.h"
+
+static SpinLock refcounter_spin;
+
+void imb_refcounter_lock_init(void)
+{
+ BLI_spin_init(&refcounter_spin);
+}
+
+void imb_refcounter_lock_exit(void)
+{
+ BLI_spin_end(&refcounter_spin);
+}
void imb_freemipmapImBuf(ImBuf *ibuf)
{
@@ -154,10 +167,18 @@ void IMB_freezbuffloatImBuf(ImBuf *ibuf)
void IMB_freeImBuf(ImBuf *ibuf)
{
if (ibuf) {
+ bool needs_free = false;
+
+ BLI_spin_lock(&refcounter_spin);
if (ibuf->refcounter > 0) {
ibuf->refcounter--;
}
else {
+ needs_free = true;
+ }
+ BLI_spin_unlock(&refcounter_spin);
+
+ if (needs_free) {
imb_freerectImBuf(ibuf);
imb_freerectfloatImBuf(ibuf);
imb_freetilesImBuf(ibuf);
@@ -177,7 +198,9 @@ void IMB_freeImBuf(ImBuf *ibuf)
void IMB_refImBuf(ImBuf *ibuf)
{
+ BLI_spin_lock(&refcounter_spin);
ibuf->refcounter++;
+ BLI_spin_unlock(&refcounter_spin);
}
ImBuf *IMB_makeSingleUser(ImBuf *ibuf)
diff --git a/source/blender/imbuf/intern/module.c b/source/blender/imbuf/intern/module.c
index 9141dad6f9c..4097deb00ed 100644
--- a/source/blender/imbuf/intern/module.c
+++ b/source/blender/imbuf/intern/module.c
@@ -26,12 +26,17 @@
#include <stddef.h>
+
+#include "BLI_utildefines.h"
+
+#include "IMB_allocimbuf.h"
#include "IMB_imbuf.h"
#include "IMB_filetype.h"
#include "IMB_colormanagement_intern.h"
void IMB_init(void)
{
+ imb_refcounter_lock_init();
imb_filetypes_init();
imb_tile_cache_init();
colormanagement_init();
@@ -42,5 +47,6 @@ void IMB_exit(void)
imb_tile_cache_exit();
imb_filetypes_exit();
colormanagement_exit();
+ imb_refcounter_lock_exit();
}