Fix T50104, Race condition in SVMShaderManager::device_update_shader

This commit is contained in:
lazydodo 2016-11-25 12:02:37 -07:00
parent bcd0d8584f
commit 265e5def76

@ -71,14 +71,13 @@ void SVMShaderManager::device_update_shader(Scene *scene,
scene->light_manager->need_update = true; scene->light_manager->need_update = true;
} }
/* We only calculate offset and do re-allocation from the locked block, /* The copy needs to be done inside the lock, if another thread resizes the array
* actual copy we do after the lock is releases to hopefully gain some * while memcpy is running, it'll be copying into possibly invalid/freed ram.
* percent of performance.
*/ */
nodes_lock_.lock(); nodes_lock_.lock();
size_t global_nodes_size = global_svm_nodes->size(); size_t global_nodes_size = global_svm_nodes->size();
global_svm_nodes->resize(global_nodes_size + svm_nodes.size()); global_svm_nodes->resize(global_nodes_size + svm_nodes.size());
nodes_lock_.unlock();
/* Offset local SVM nodes to a global address space. */ /* Offset local SVM nodes to a global address space. */
int4& jump_node = global_svm_nodes->at(shader->id); int4& jump_node = global_svm_nodes->at(shader->id);
jump_node.y = svm_nodes[0].y + global_nodes_size - 1; jump_node.y = svm_nodes[0].y + global_nodes_size - 1;
@ -88,6 +87,7 @@ void SVMShaderManager::device_update_shader(Scene *scene,
memcpy(&global_svm_nodes->at(global_nodes_size), memcpy(&global_svm_nodes->at(global_nodes_size),
&svm_nodes[1], &svm_nodes[1],
sizeof(int4) * (svm_nodes.size() - 1)); sizeof(int4) * (svm_nodes.size() - 1));
nodes_lock_.unlock();
} }
void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)