[Bf-blender-cvs] [ee72cba] master: Fix T39446: Blender Crashes when Camera Tracking

Sergey Sharybin noreply at git.blender.org
Tue Apr 1 09:17:44 CEST 2014


Commit: ee72cba008829c0ae1bb21f952e180d54dd12f88
Author: Sergey Sharybin
Date:   Tue Apr 1 13:14:37 2014 +0600
https://developer.blender.org/rBee72cba008829c0ae1bb21f952e180d54dd12f88

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.

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

M	source/blender/imbuf/intern/IMB_allocimbuf.h
M	source/blender/imbuf/intern/allocimbuf.c
M	source/blender/imbuf/intern/module.c

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

diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h
index 02b738c..f4d6d86 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 d7ca381..d0e81f2 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 9141dad..4097deb 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();
 }




More information about the Bf-blender-cvs mailing list