diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-07-13 17:47:13 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-07-13 17:47:13 +0400 |
commit | 807ad1f0e0de49711d58ade2b660e74ec5452b2b (patch) | |
tree | 06989f02b2a73b64cb89e28d79a294ac357c4206 /source/blender/blenlib/intern/threads.c | |
parent | a5e6d73d412146cf9cdd077aec0b71cb615dd361 (diff) |
Fix #32087: Crash while changing values in comp editor (bt and blender included)
Issue was caused by threading conflict between compositor output node which
is freeing buffers used by render result image and image draw code which
could use buffers at the same time as compositor frees this buffers.
Solved by adding adding lock around viewer image invalidation and image
drawing.
Use renamed LOCK_PREVIEW mutex for this, which si not called LOCK_DRAW_IMAGE.
With new compositor locking for preview is not needed so it could be removed.
Added the same lock around viewer operation which also frees buffers used
by viewer image. It's actually quite difficult to check whether this is
indeed needed. This code seems to be using acquire/release technique, but
somehow acquiring ImBuf before invalidating it in compositor operation
doesn't resolve the issue, so probably it's not actually locking acquire
and things should be checked deeper.
Diffstat (limited to 'source/blender/blenlib/intern/threads.c')
-rw-r--r-- | source/blender/blenlib/intern/threads.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index 348fa29eae7..9994f89acd5 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -106,7 +106,7 @@ static void *thread_tls_data; ************************************************ */ static pthread_mutex_t _malloc_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _image_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t _preview_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t _image_draw_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _custom1_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER; @@ -337,8 +337,8 @@ void BLI_lock_thread(int type) { if (type == LOCK_IMAGE) pthread_mutex_lock(&_image_lock); - else if (type == LOCK_PREVIEW) - pthread_mutex_lock(&_preview_lock); + else if (type == LOCK_DRAW_IMAGE) + pthread_mutex_lock(&_image_draw_lock); else if (type == LOCK_VIEWER) pthread_mutex_lock(&_viewer_lock); else if (type == LOCK_CUSTOM1) @@ -357,8 +357,8 @@ void BLI_unlock_thread(int type) { if (type == LOCK_IMAGE) pthread_mutex_unlock(&_image_lock); - else if (type == LOCK_PREVIEW) - pthread_mutex_unlock(&_preview_lock); + else if (type == LOCK_DRAW_IMAGE) + pthread_mutex_unlock(&_image_draw_lock); else if (type == LOCK_VIEWER) pthread_mutex_unlock(&_viewer_lock); else if (type == LOCK_CUSTOM1) |