[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58169] branches/soc-2013-depsgraph_mt/ source/blender/blenkernel/intern/font.c: Make fonts safe(r) for threading

Sergey Sharybin sergey.vfx at gmail.com
Thu Jul 11 11:15:20 CEST 2013


Revision: 58169
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58169
Author:   nazgul
Date:     2013-07-11 09:15:19 +0000 (Thu, 11 Jul 2013)
Log Message:
-----------
Make fonts safe(r) for threading

Getting vfont data wasn't safe for threading, because it
was modifying font data which is in bmain and could be
shared by multiple objects.

For now made it so getting vfont uses critical section,
meaning vfont->data is initializing from inside a locked
mutex.

Modified Paths:
--------------
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/font.c

Modified: branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/font.c
===================================================================
--- branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/font.c	2013-07-11 08:44:02 UTC (rev 58168)
+++ branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/font.c	2013-07-11 09:15:19 UTC (rev 58169)
@@ -1,4 +1,5 @@
 /*
+
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -41,6 +42,7 @@
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
+#include "BLI_threads.h"
 #include "BLI_vfontdata.h"
 #include "BLI_utildefines.h"
 
@@ -59,6 +61,7 @@
 #include "BKE_curve.h"
 #include "BKE_displist.h"
 
+static ThreadMutex vfont_mutex = BLI_MUTEX_INITIALIZER;
 
 /* The vfont code */
 void BKE_vfont_free_data(struct VFont *vfont)
@@ -138,6 +141,18 @@
 	if (!vfont->data) {
 		PackedFile *pf;
 
+		BLI_mutex_lock(&vfont_mutex);
+
+		if (vfont->data) {
+			/* Check data again, since it might have been already
+			 * initialized from other thread (previous check is
+			 * not accurate or threading, just prevents unneeded
+			 * lock if all the data is here for sure).
+			 */
+			BLI_mutex_unlock(&vfont_mutex);
+			return vfont->data;
+		}
+
 		if (BKE_vfont_is_builtin(vfont)) {
 			pf = get_builtin_packedfile();
 		}
@@ -175,8 +190,10 @@
 				freePackedFile(pf);
 			}
 		}
+
+		BLI_mutex_unlock(&vfont_mutex);
 	}
-	
+
 	return vfont->data;
 }
 




More information about the Bf-blender-cvs mailing list