Fix Cycles Embree crash on macOS, due to too small thread stack size.

This commit is contained in:
Brecht Van Lommel 2019-02-14 14:37:57 +01:00
parent 93d11edd7e
commit fb6f1aa12f
2 changed files with 23 additions and 5 deletions

View File

@ -26,7 +26,17 @@ thread::thread(function<void()> run_cb, int node)
joined_(false),
node_(node)
{
thread_ = std::thread(&thread::run, this);
#ifdef __APPLE__
/* Set the stack size to 2MB to match Linux. The default 512KB on macOS is
* too small for Embree, and consistent stack size also makes things more
* predictable in general. */
pthread_attr_t attribute;
pthread_attr_init(&attribute);
pthread_attr_setstacksize(&attribute, 1024*1024*2);
pthread_create(&pthread_id, &attribute, run, (void*)this);
#else
std_thread = std::thread(&thread::run, this);
#endif
}
thread::~thread()
@ -49,13 +59,17 @@ void *thread::run(void *arg)
bool thread::join()
{
joined_ = true;
#ifdef __APPLE__
return pthread_join(pthread_id, NULL) == 0;
#else
try {
thread_.join();
std_thread.join();
return true;
}
catch (const std::system_error&) {
return false;
}
#endif
}
CCL_NAMESPACE_END

View File

@ -41,8 +41,8 @@ typedef std::mutex thread_mutex;
typedef std::unique_lock<std::mutex> thread_scoped_lock;
typedef std::condition_variable thread_condition_variable;
/* own pthread based implementation, to avoid boost version conflicts with
* dynamically loaded blender plugins */
/* Own thread implementation similar to std::thread, so we can set a
* custom stack size on macOS. */
class thread {
public:
@ -56,7 +56,11 @@ public:
protected:
function<void()> run_cb_;
std::thread thread_;
#ifdef __APPLE__
pthread_t pthread_id;
#else
std::thread std_thread;
#endif
bool joined_;
int node_;
};