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>2015-05-18 10:41:51 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-05-18 14:40:51 +0300
commitb88597c2186689e8eaaf3cb3f5b2601b449781fe (patch)
treeec9fec142af7df5401d5c9177ffd13f7684d1c5f /source/blender/blenlib/intern/threads.c
parent17388794ce0d31344944842b1f76d23921687cc4 (diff)
Make switching to threaded malloc safe to be called from threads
For a long time this function was only intended to be used from the main thread, but since out implementation of parallel range (which is currently only used by mesh deform modifier) we might want to switch to threaded alloc from object update thread. Now we're using spinlock around the check, which makes the code safe to be used from all over the place. We might consider using a bit of atomics operations magic there, but it's not so much important for now, this code is not used in the performance critical code path.
Diffstat (limited to 'source/blender/blenlib/intern/threads.c')
-rw-r--r--source/blender/blenlib/intern/threads.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index da06500565c..a404f46a6e2 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -802,10 +802,12 @@ void BLI_begin_threaded_malloc(void)
/* Used for debug only */
/* BLI_assert(thread_levels >= 0); */
+ BLI_spin_lock(&_malloc_lock);
if (thread_levels == 0) {
MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
}
thread_levels++;
+ BLI_spin_unlock(&_malloc_lock);
}
void BLI_end_threaded_malloc(void)
@@ -813,8 +815,10 @@ void BLI_end_threaded_malloc(void)
/* Used for debug only */
/* BLI_assert(thread_levels >= 0); */
+ BLI_spin_lock(&_malloc_lock);
thread_levels--;
if (thread_levels == 0)
MEM_set_lock_callback(NULL, NULL);
+ BLI_spin_unlock(&_malloc_lock);
}