loader: Remove TLS
authorCharles Giessen <charles@lunarg.com>
Sat, 4 Sep 2021 19:48:37 +0000 (13:48 -0600)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Thu, 9 Sep 2021 17:28:56 +0000 (11:28 -0600)
The only purpose TLS was serving was as a channel for allocation callbacks to
be useable inside cJSON and dirent_on_windows. TLS didn't solve any specific
threading problem. Instead it served as an information channel. On top of that,
the only time when the TLS was used was inside vkCreateInstance as the
pre-instance calls would have the TLS pointer to loader_instance be set to
NULL.

loader/loader.c
loader/loader.h
loader/trampoline.c
loader/vk_loader_platform.h

index 9c0add031e8a85260ef757b67b54c6f2d70e4af4..cdeccc3ebe212f704bf66549d69819846084adb7 100644 (file)
@@ -104,8 +104,6 @@ static PFN_CreateDXGIFactory1 fpCreateDXGIFactory1;
 #define VK_OVERRIDE_LAYER_NAME "VK_LAYER_LUNARG_override"
 
 struct loader_struct loader = {0};
-// TLS for instance for alloc/free callbacks
-THREAD_LOCAL_DECL struct loader_instance *tls_instance;
 
 static size_t loader_platform_combine_path(char *dest, size_t len, ...);
 
@@ -191,12 +189,6 @@ void *loader_instance_heap_realloc(const struct loader_instance *instance, void
     return pNewMem;
 }
 
-void *loader_instance_tls_heap_alloc(size_t size) {
-    return loader_instance_heap_alloc(tls_instance, size, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
-}
-
-void loader_instance_tls_heap_free(void *pMemory) { loader_instance_heap_free(tls_instance, pMemory); }
-
 void *loader_device_heap_alloc(const struct loader_device *device, size_t size, VkSystemAllocationScope alloc_scope) {
     void *pMemory = NULL;
 #if (DEBUG_DISABLE_APP_ALLOCATORS == 1)
@@ -7805,7 +7797,7 @@ terminator_EnumerateInstanceExtensionProperties(const VkEnumerateInstanceExtensi
     uint32_t copy_size;
     VkResult res = VK_SUCCESS;
 
-    // tls_instance = NULL;
+
     memset(&local_ext_list, 0, sizeof(local_ext_list));
     memset(&instance_layers, 0, sizeof(instance_layers));
 
@@ -7889,7 +7881,6 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_EnumerateInstanceLayerProperties(const
                                                                            VkLayerProperties *pProperties) {
     VkResult result = VK_SUCCESS;
     struct loader_layer_list instance_layer_list;
-    tls_instance = NULL;
 
     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
 
index 9ad4f6bab8c198f917729a954a5a16ab9e0426ad..ee54da06fcc2927eb97538e4d9806946779a4ea0 100644 (file)
@@ -66,7 +66,6 @@ static inline void loader_init_dispatch(void *obj, const void *data) {
 
 // Global variables used across files
 extern struct loader_struct loader;
-extern THREAD_LOCAL_DECL struct loader_instance *tls_instance;
 extern loader_platform_thread_mutex loader_lock;
 extern loader_platform_thread_mutex loader_json_lock;
 extern loader_platform_thread_mutex loader_preload_icd_lock;
@@ -81,8 +80,6 @@ void *loader_instance_heap_alloc(const struct loader_instance *instance, size_t
 void loader_instance_heap_free(const struct loader_instance *instance, void *pMemory);
 void *loader_instance_heap_realloc(const struct loader_instance *instance, void *pMemory, size_t orig_size, size_t size,
                                    VkSystemAllocationScope alloc_scope);
-void *loader_instance_tls_heap_alloc(size_t size);
-void loader_instance_tls_heap_free(void *pMemory);
 void *loader_device_heap_alloc(const struct loader_device *device, size_t size, VkSystemAllocationScope allocationScope);
 void loader_device_heap_free(const struct loader_device *device, void *pMemory);
 void *loader_device_heap_realloc(const struct loader_device *device, void *pMemory, size_t orig_size, size_t size,
index 75ec1722e5de5fee974bb15aa19041c9f90d7ac8..fb3f7471e3ad572bde5e562403703ef79939a0ab 100644 (file)
@@ -98,7 +98,6 @@ LOADER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDev
 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName,
                                                                                     uint32_t *pPropertyCount,
                                                                                     VkExtensionProperties *pProperties) {
-    tls_instance = NULL;
     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
 
     // We know we need to call at least the terminator
@@ -192,7 +191,6 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionPropert
 
 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pPropertyCount,
                                                                                 VkLayerProperties *pProperties) {
-    tls_instance = NULL;
     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
 
     // We know we need to call at least the terminator
@@ -285,7 +283,6 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
 }
 
 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceVersion(uint32_t *pApiVersion) {
-    tls_instance = NULL;
     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
 
     // We know we need to call at least the terminator
@@ -402,7 +399,6 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCr
         goto out;
     }
 
-    tls_instance = ptr_instance;
     loader_platform_thread_lock_mutex(&loader_lock);
     loaderLocked = true;
     memset(ptr_instance, 0, sizeof(struct loader_instance));
index c5f903d979fa98cce6ad5749ecd68b4fef5c917b..78b23ce28f6607ce6bd07593408cbc10a75b228d 100644 (file)
@@ -198,7 +198,6 @@ static inline const char *loader_platform_get_proc_address_error(const char *nam
 
 // Threads:
 typedef pthread_t loader_platform_thread;
-#define THREAD_LOCAL_DECL __thread
 
 // The once init functionality is not used on Linux
 #define LOADER_PLATFORM_THREAD_ONCE_DECLARATION(var)
@@ -397,23 +396,6 @@ static char *loader_platform_get_proc_address_error(const char *name) {
 // Threads:
 typedef HANDLE loader_platform_thread;
 
-// __declspec(thread) is not supported by MinGW compiler (ignored with warning or
-//                    cause error depending on compiler switches)
-//
-// __thread should be used instead
-//
-// __MINGW32__ defined for both 32 and 64 bit MinGW compilers, so it is enough to
-// detect any (32 or 64) flavor of MinGW compiler.
-//
-// @note __GNUC__ could be used as a more generic way to detect _any_
-//       GCC[-compatible] compiler on Windows, but this fix was tested
-//       only with MinGW, so keep it explicit at the moment.
-#if defined(__MINGW32__)
-#define THREAD_LOCAL_DECL __thread
-#else
-#define THREAD_LOCAL_DECL __declspec(thread)
-#endif
-
 // The once init functionality is not used when building a DLL on Windows. This is because there is no way to clean up the
 // resources allocated by anything allocated by once init. This isn't a problem for static libraries, but it is for dynamic
 // ones. When building a DLL, we use DllMain() instead to allow properly cleaning up resources.