From 683db783d030d6a3ce56e6843e7d0d4e5eaadbbd Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 11 Jul 2013 09:15:19 +0000 Subject: [PATCH] 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. --- source/blender/blenkernel/intern/font.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 60c00f82113..e0b72711ed6 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -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 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont) 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 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont) freePackedFile(pf); } } + + BLI_mutex_unlock(&vfont_mutex); } - + return vfont->data; }