forked from bartvdbraak/blender
OSX vs OpenMP : implement workaround to fix crashes when using mop from a background thread
Fix# 20043 & 20392 The issue is that OSX lib does not implement TLS (Thread Local Storage), so libgomp uses pthread functions to read/write thread specific vars. But this implementation is currently (gcc 4.2) buggy : the write function is called only at lib start (in main thread), and the var is undefined for background thread. The workaround is to perform this gomp_tls_key var write at beginning of background threads that use openMP. (Currently: render & fluidsim)
This commit is contained in:
parent
4271a40ee7
commit
1975ee5eec
@ -33,9 +33,9 @@ IF(WINDOWS)
|
||||
ADD_DEFINITIONS(-DUSE_MSVC6FIXES)
|
||||
ENDIF(WINDOWS)
|
||||
|
||||
IF(WITH_OPENMP AND NOT APPLE)
|
||||
IF(WITH_OPENMP)
|
||||
ADD_DEFINITIONS(-DPARALLEL=1)
|
||||
ENDIF(WITH_OPENMP AND NOT APPLE)
|
||||
ENDIF(WITH_OPENMP)
|
||||
|
||||
BLENDERLIB_NOLIST(bf_elbeem "${SRC}" "${INC}")
|
||||
#, libtype='blender', priority=0 )
|
||||
|
@ -8,7 +8,6 @@ sources = env.Glob('intern/*.cpp')
|
||||
defs = 'NOGUI ELBEEM_BLENDER=1'
|
||||
|
||||
if env['WITH_BF_OPENMP']:
|
||||
if env['OURPLATFORM'] != 'darwin':
|
||||
defs += ' PARALLEL'
|
||||
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
|
||||
|
@ -71,6 +71,10 @@ IF(WITH_FFMPEG)
|
||||
ADD_DEFINITIONS(-DWITH_FFMPEG)
|
||||
ENDIF(WITH_FFMPEG)
|
||||
|
||||
IF(WITH_OPENMP)
|
||||
ADD_DEFINITIONS(-DPARALLEL=1)
|
||||
ENDIF(WITH_OPENMP)
|
||||
|
||||
IF(NOT WITH_ELBEEM)
|
||||
ADD_DEFINITIONS(-DDISABLE_ELBEEM)
|
||||
ENDIF(NOT WITH_ELBEEM)
|
||||
|
@ -8,6 +8,8 @@ incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
|
||||
incs += ' ../../gpu'
|
||||
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
|
||||
|
||||
defs = ''
|
||||
|
||||
if env['OURPLATFORM'] == 'linux2':
|
||||
cflags='-pthread'
|
||||
incs += ' ../../../extern/binreloc/include'
|
||||
@ -15,4 +17,9 @@ if env['OURPLATFORM'] == 'linux2':
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
|
||||
incs += ' ' + env['BF_PTHREADS_INC']
|
||||
|
||||
env.BlenderLib ( 'bf_editors_physics', sources, Split(incs), [], libtype=['core'], priority=[45] )
|
||||
|
||||
if env['OURPLATFORM'] == 'darwin':
|
||||
if env['WITH_BF_OPENMP']:
|
||||
defs += ' PARALLEL=1'
|
||||
|
||||
env.BlenderLib ( 'bf_editors_physics', sources, Split(incs), Split(defs), libtype=['core'], priority=[45] )
|
||||
|
@ -98,6 +98,14 @@
|
||||
/* enable/disable overall compilation */
|
||||
#ifndef DISABLE_ELBEEM
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */
|
||||
#include <pthread.h>
|
||||
extern pthread_key_t gomp_tls_key;
|
||||
static void *thread_tls_data;
|
||||
#endif
|
||||
|
||||
|
||||
/* XXX */
|
||||
/* from header info.c */
|
||||
static int start_progress_bar(void) {return 0;};
|
||||
@ -320,6 +328,11 @@ static void *fluidsimSimulateThread(void *unused) { // *ptr) {
|
||||
//char* fnameCfgPath = (char*)(ptr);
|
||||
int ret=0;
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
// Workaround for Apple gcc 4.2.1 omp vs background thread bug
|
||||
pthread_setspecific (gomp_tls_key, thread_tls_data);
|
||||
#endif
|
||||
|
||||
ret = elbeemSimulate();
|
||||
BLI_lock_thread(LOCK_CUSTOM1);
|
||||
if(globalBakeState==0) {
|
||||
@ -1036,6 +1049,11 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *ob)
|
||||
// set to neutral, -1 means user abort, -2 means init error
|
||||
globalBakeState = 0;
|
||||
globalBakeFrame = 0;
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
// Workaround for Apple gcc 4.2.1 omp vs background thread bug
|
||||
thread_tls_data = pthread_getspecific(gomp_tls_key);
|
||||
#endif
|
||||
BLI_init_threads(&threads, fluidsimSimulateThread, 1);
|
||||
BLI_insert_thread(&threads, targetFile);
|
||||
|
||||
|
@ -22,4 +22,8 @@ if env['OURPLATFORM'] == 'linux2':
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
|
||||
incs += ' ' + env['BF_PTHREADS_INC']
|
||||
|
||||
if env['OURPLATFORM'] == 'darwin':
|
||||
if env['WITH_BF_OPENMP']:
|
||||
defs += ' PARALLEL=1'
|
||||
|
||||
env.BlenderLib ( 'bf_editors_screen', sources, Split(incs), Split(defs), libtype=['core'], priority=[105] )
|
||||
|
@ -96,6 +96,12 @@
|
||||
#define KM_MODAL_STEP10 3
|
||||
#define KM_MODAL_STEP10_OFF 4
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */
|
||||
#include <pthread.h>
|
||||
extern pthread_key_t gomp_tls_key;
|
||||
static void *thread_tls_data;
|
||||
#endif
|
||||
/* ************** Exported Poll tests ********************** */
|
||||
|
||||
int ED_operator_regionactive(bContext *C)
|
||||
@ -3015,6 +3021,11 @@ static void render_startjob(void *rjv, short *stop, short *do_update)
|
||||
rj->stop= stop;
|
||||
rj->do_update= do_update;
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
// Workaround for Apple gcc 4.2.1 omp vs background thread bug
|
||||
pthread_setspecific (gomp_tls_key, thread_tls_data);
|
||||
#endif
|
||||
|
||||
if(rj->anim)
|
||||
RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step);
|
||||
else
|
||||
@ -3096,6 +3107,11 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0);
|
||||
WM_jobs_callbacks(steve, render_startjob, NULL, NULL);
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
// Workaround for Apple gcc 4.2.1 omp vs background thread bug
|
||||
thread_tls_data = pthread_getspecific(gomp_tls_key);
|
||||
#endif
|
||||
|
||||
/* get a render result image, and make sure it is empty */
|
||||
ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result");
|
||||
BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
|
||||
|
Loading…
Reference in New Issue
Block a user