Fix T39446: Blender Crashes when Camera Tracking

Issue is likely caused by thread-unsafe nature of IMB_freeImBuf
which might lead to race condition in some circumstances.

Now made it thread-safe and from Sebastian's tests seems crash is
gone now, so hopefully the root of the issue is finally nailed down.
This commit is contained in:
Sergey Sharybin 2014-04-01 13:14:37 +06:00
parent e95fd79258
commit ee72cba008
Notes: blender-bot 2023-03-24 17:05:22 +01:00
Referenced by issue #39446, Blender Crashes when Camera Tracking
3 changed files with 32 additions and 0 deletions

View File

@ -35,6 +35,9 @@
struct ImBuf;
void imb_refcounter_lock_init(void);
void imb_refcounter_lock_exit(void);
bool imb_addencodedbufferImBuf(struct ImBuf *ibuf);
bool imb_enlargeencodedbufferImBuf(struct ImBuf *ibuf);

View File

@ -49,6 +49,19 @@
#include "MEM_CacheLimiterC-Api.h"
#include "BLI_utildefines.h"
#include "BLI_threads.h"
static SpinLock refcounter_spin;
void imb_refcounter_lock_init(void)
{
BLI_spin_init(&refcounter_spin);
}
void imb_refcounter_lock_exit(void)
{
BLI_spin_end(&refcounter_spin);
}
void imb_freemipmapImBuf(ImBuf *ibuf)
{
@ -154,10 +167,18 @@ void IMB_freezbuffloatImBuf(ImBuf *ibuf)
void IMB_freeImBuf(ImBuf *ibuf)
{
if (ibuf) {
bool needs_free = false;
BLI_spin_lock(&refcounter_spin);
if (ibuf->refcounter > 0) {
ibuf->refcounter--;
}
else {
needs_free = true;
}
BLI_spin_unlock(&refcounter_spin);
if (needs_free) {
imb_freerectImBuf(ibuf);
imb_freerectfloatImBuf(ibuf);
imb_freetilesImBuf(ibuf);
@ -177,7 +198,9 @@ void IMB_freeImBuf(ImBuf *ibuf)
void IMB_refImBuf(ImBuf *ibuf)
{
BLI_spin_lock(&refcounter_spin);
ibuf->refcounter++;
BLI_spin_unlock(&refcounter_spin);
}
ImBuf *IMB_makeSingleUser(ImBuf *ibuf)

View File

@ -26,12 +26,17 @@
#include <stddef.h>
#include "BLI_utildefines.h"
#include "IMB_allocimbuf.h"
#include "IMB_imbuf.h"
#include "IMB_filetype.h"
#include "IMB_colormanagement_intern.h"
void IMB_init(void)
{
imb_refcounter_lock_init();
imb_filetypes_init();
imb_tile_cache_init();
colormanagement_init();
@ -42,5 +47,6 @@ void IMB_exit(void)
imb_tile_cache_exit();
imb_filetypes_exit();
colormanagement_exit();
imb_refcounter_lock_exit();
}