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:
-rw-r--r--source/blender/blenkernel/intern/font.c15
-rw-r--r--source/blender/blenlib/BLI_threads.h2
2 files changed, 16 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 608d5a72756..6256c878d8d 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -65,6 +65,7 @@
#include "BKE_displist.h"
static ThreadMutex vfont_mutex = BLI_MUTEX_INITIALIZER;
+static ThreadRWMutex vfont_rwlock = BLI_RWLOCK_INITIALIZER;
/* The vfont code */
void BKE_vfont_free_data(struct VFont *vfont)
@@ -595,7 +596,9 @@ makebreak:
if (vfont == NULL) break;
if (!ELEM(ascii, '\n', '\0')) {
+ BLI_rw_mutex_lock(&vfont_rwlock, THREAD_LOCK_READ);
che = find_vfont_char(vfd, ascii);
+ BLI_rw_mutex_unlock(&vfont_rwlock);
/*
* The character wasn't in the current curve base so load it
@@ -603,7 +606,17 @@ makebreak:
* whole font is in the memory already
*/
if (che == NULL && BKE_vfont_is_builtin(vfont) == false) {
- che = BLI_vfontchar_from_freetypefont(vfont, ascii);
+ BLI_rw_mutex_lock(&vfont_rwlock, THREAD_LOCK_WRITE);
+ /* Check it once again, char might have been already load
+ * between previous BLI_rw_mutex_unlock() and this BLI_rw_mutex_lock().
+ *
+ * Such a check should not be a bottleneck since it wouldn't
+ * happen often once all the chars are load.
+ */
+ if ((che = find_vfont_char(vfd, ascii)) == NULL) {
+ che = BLI_vfontchar_from_freetypefont(vfont, ascii);
+ }
+ BLI_rw_mutex_unlock(&vfont_rwlock);
}
}
else {
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 7a3ee1dd0f4..3ccfcc023da 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -125,6 +125,8 @@ void BLI_spin_end(SpinLock *spin);
#define THREAD_LOCK_READ 1
#define THREAD_LOCK_WRITE 2
+#define BLI_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
+
typedef pthread_rwlock_t ThreadRWMutex;
void BLI_rw_mutex_init(ThreadRWMutex *mutex);