Commit: 93d711ce552959a733b27d6fce4ee30e4a2e9ec8
Author: Sergey Sharybin
Date:   Wed Oct 11 12:48:19 2017 +0500
Branches: blender-v2.79a-release
https://developer.blender.org/rB93d711ce552959a733b27d6fce4ee30e4a2e9ec8

Cycles: Fix possible race condition when initializing devices list

===================================================================

M       intern/cycles/device/device.cpp
M       intern/cycles/device/device.h

===================================================================

diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 0674d860e97..05e65d5f64d 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -34,6 +34,7 @@ CCL_NAMESPACE_BEGIN
 
 bool Device::need_types_update = true;
 bool Device::need_devices_update = true;
+thread_mutex Device::device_mutex;
 vector<DeviceType> Device::types;
 vector<DeviceInfo> Device::devices;
 
@@ -296,54 +297,49 @@ string Device::string_from_type(DeviceType type)
 
 vector<DeviceType>& Device::available_types()
 {
+       thread_scoped_lock lock(device_mutex);
        if(need_types_update) {
                types.clear();
                types.push_back(DEVICE_CPU);
-
 #ifdef WITH_CUDA
-               if(device_cuda_init())
+               if(device_cuda_init()) {
                        types.push_back(DEVICE_CUDA);
+               }
 #endif
-
 #ifdef WITH_OPENCL
-               if(device_opencl_init())
+               if(device_opencl_init()) {
                        types.push_back(DEVICE_OPENCL);
+               }
 #endif
-
 #ifdef WITH_NETWORK
                types.push_back(DEVICE_NETWORK);
 #endif
-
                need_types_update = false;
        }
-
        return types;
 }
 
 vector<DeviceInfo>& Device::available_devices()
 {
+       thread_scoped_lock lock(device_mutex);
        if(need_devices_update) {
                devices.clear();
-
 #ifdef WITH_OPENCL
-               if(device_opencl_init())
+               if(device_opencl_init()) {
                        device_opencl_info(devices);
+               }
 #endif
-
 #ifdef WITH_CUDA
-               if(device_cuda_init())
+               if(device_cuda_init()) {
                        device_cuda_info(devices);
+               }
 #endif
-
                device_cpu_info(devices);
-
 #ifdef WITH_NETWORK
                device_network_info(devices);
 #endif
-
                need_devices_update = false;
        }
-
        return devices;
 }
 
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index b3b693c630c..a70f6923803 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -351,6 +351,7 @@ public:
 private:
        /* Indicted whether device types and devices lists were initialized. */
        static bool need_types_update, need_devices_update;
+       static thread_mutex device_mutex;
        static vector<DeviceType> types;
        static vector<DeviceInfo> devices;
 };

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to