[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52019] trunk/blender/intern/cycles: Fix #33125: cycles OSL crash with multiple render sessions running at the same time.
Brecht Van Lommel
brechtvanlommel at pandora.be
Fri Nov 9 04:10:23 CET 2012
Revision: 52019
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52019
Author: blendix
Date: 2012-11-09 03:10:22 +0000 (Fri, 09 Nov 2012)
Log Message:
-----------
Fix #33125: cycles OSL crash with multiple render sessions running at the same time.
Modified Paths:
--------------
trunk/blender/intern/cycles/kernel/osl/osl_globals.h
trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
trunk/blender/intern/cycles/render/osl.cpp
trunk/blender/intern/cycles/render/osl.h
Modified: trunk/blender/intern/cycles/kernel/osl/osl_globals.h
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_globals.h 2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/kernel/osl/osl_globals.h 2012-11-09 03:10:22 UTC (rev 52019)
@@ -68,6 +68,11 @@
};
static tls_ptr(ThreadData, thread_data);
+ static thread_mutex thread_data_mutex;
+ static volatile int thread_data_users;
+
+ void thread_data_init();
+ void thread_data_free();
};
CCL_NAMESPACE_END
Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp 2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp 2012-11-09 03:10:22 UTC (rev 52019)
@@ -32,9 +32,32 @@
CCL_NAMESPACE_BEGIN
tls_ptr(OSLGlobals::ThreadData, OSLGlobals::thread_data);
+volatile int OSLGlobals::thread_data_users = 0;
+thread_mutex OSLGlobals::thread_data_mutex;
/* Threads */
+void OSLGlobals::thread_data_init()
+{
+ thread_scoped_lock thread_data_lock(thread_data_mutex);
+
+ if(thread_data_users == 0)
+ tls_create(OSLGlobals::ThreadData, thread_data);
+
+ thread_data_users++;
+}
+
+void OSLGlobals::thread_data_free()
+{
+ /* thread local storage delete */
+ thread_scoped_lock thread_data_lock(thread_data_mutex);
+
+ thread_data_users--;
+
+ if(thread_data_users == 0)
+ tls_delete(OSLGlobals::ThreadData, thread_data);
+}
+
void OSLShader::thread_init(KernelGlobals *kg)
{
OSL::ShadingSystem *ss = kg->osl.ss;
Modified: trunk/blender/intern/cycles/render/osl.cpp
===================================================================
--- trunk/blender/intern/cycles/render/osl.cpp 2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/render/osl.cpp 2012-11-09 03:10:22 UTC (rev 52019)
@@ -45,6 +45,8 @@
OSLShaderManager::OSLShaderManager()
{
+ thread_data_initialized = false;
+
services = new OSLRenderServices();
shading_system_init();
@@ -91,8 +93,6 @@
og->background_state = og->surface_state[background_id & SHADER_MASK];
og->use = true;
- tls_create(OSLGlobals::ThreadData, og->thread_data);
-
foreach(Shader *shader, scene->shaders)
shader->need_update = false;
@@ -102,6 +102,11 @@
scene->image_manager->set_osl_texture_system((void*)ts);
device_update_common(device, dscene, scene, progress);
+
+ if(!thread_data_initialized) {
+ og->thread_data_init();
+ thread_data_initialized = true;
+ }
}
void OSLShaderManager::device_free(Device *device, DeviceScene *dscene)
@@ -114,12 +119,15 @@
og->use = false;
og->ss = NULL;
- tls_delete(OSLGlobals::ThreadData, og->thread_data);
-
og->surface_state.clear();
og->volume_state.clear();
og->displacement_state.clear();
og->background_state.reset();
+
+ if(thread_data_initialized) {
+ og->thread_data_free();
+ thread_data_initialized = false;
+ }
}
void OSLShaderManager::texture_system_init()
Modified: trunk/blender/intern/cycles/render/osl.h
===================================================================
--- trunk/blender/intern/cycles/render/osl.h 2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/render/osl.h 2012-11-09 03:10:22 UTC (rev 52019)
@@ -73,6 +73,8 @@
OSLRenderServices *services;
OSL::ErrorHandler errhandler;
set<string> loaded_shaders;
+
+ bool thread_data_initialized;
};
#endif
More information about the Bf-blender-cvs
mailing list