diff options
| author | Lenny Komow <lenny@lunarg.com> | 2018-01-15 15:43:36 -0700 |
|---|---|---|
| committer | Lenny Komow <lenny@lunarg.com> | 2018-01-16 15:49:54 -0700 |
| commit | 8151d72fc263001da497ee219d884e2e57cdfa3f (patch) | |
| tree | 0e9b5a99fd10f72b5260325346ee682afc45d87f /loader | |
| parent | c784290e43bf89ef3c52f112d5e7e2d06f75ab69 (diff) | |
| download | usermoji-8151d72fc263001da497ee219d884e2e57cdfa3f.tar.xz | |
loader: Clean up mutexes on destruction
Change-Id: I7d1524da9167a576420c109ebbce8ebb5121cad0
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader.c | 34 | ||||
| -rw-r--r-- | loader/loader.h | 1 | ||||
| -rw-r--r-- | loader/trampoline.c | 4 | ||||
| -rw-r--r-- | loader/vk_loader_platform.h | 2 |
4 files changed, 29 insertions, 12 deletions
diff --git a/loader/loader.c b/loader/loader.c index 0629d908..fd9e1165 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -92,8 +92,6 @@ uint32_t g_loader_log_msgs = 0; loader_platform_thread_mutex loader_lock; loader_platform_thread_mutex loader_json_lock; -LOADER_PLATFORM_THREAD_ONCE_DECLARATION(once_init); - void *loader_instance_heap_alloc(const struct loader_instance *instance, size_t size, VkSystemAllocationScope alloc_scope) { void *pMemory = NULL; #if (DEBUG_DISABLE_APP_ALLOCATORS == 1) @@ -1926,6 +1924,12 @@ struct loader_manifest_files { char **filename_list; }; +void loader_release() { + // release mutexs + loader_platform_thread_delete_mutex(&loader_lock); + loader_platform_thread_delete_mutex(&loader_json_lock); +} + // Get next file or dirname given a string list or registry key path // // \returns @@ -5888,7 +5892,6 @@ terminator_EnumerateInstanceExtensionProperties(const VkEnumerateInstanceExtensi // tls_instance = NULL; memset(&local_ext_list, 0, sizeof(local_ext_list)); memset(&instance_layers, 0, sizeof(instance_layers)); - // loader_platform_thread_once(&once_init, loader_initialize); // Get layer libraries if needed if (pLayerName && strlen(pLayerName) != 0) { @@ -5970,8 +5973,6 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_EnumerateInstanceLayerProperties(const struct loader_layer_list instance_layer_list; tls_instance = NULL; - loader_platform_thread_once(&once_init, loader_initialize); - uint32_t copy_size; // Get layer libraries @@ -6000,3 +6001,26 @@ out: loader_delete_layer_properties(NULL, &instance_layer_list); return result; } + +#if defined(_WIN32) +BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) { + switch (reason) { + case DLL_PROCESS_ATTACH: + loader_initialize(); + break; + case DLL_PROCESS_DETACH: + if (NULL == reserved) { + loader_release(); + } + break; + default: + // Do nothing + break; + } + return TRUE; +} +#else +__attribute__((constructor)) void loader_init_library() { loader_initialize(); } + +__attribute__((destructor)) void loader_free_library() { loader_release(); } +#endif diff --git a/loader/loader.h b/loader/loader.h index aad20eb0..2c5739b0 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -379,7 +379,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_ONCE_DEFINITION(once_init); extern loader_platform_thread_mutex loader_lock; extern loader_platform_thread_mutex loader_json_lock; diff --git a/loader/trampoline.c b/loader/trampoline.c index 4277edb3..26d30922 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -95,7 +95,6 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionPropert 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 VkResult res = VK_SUCCESS; @@ -183,7 +182,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 VkResult res = VK_SUCCESS; @@ -275,8 +273,6 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCr bool loaderLocked = false; VkResult res = VK_ERROR_INITIALIZATION_FAILED; - loader_platform_thread_once(&once_init, loader_initialize); - // Fail if the requested Vulkan apiVersion is > 1.0 since the loader only supports 1.0. // Having pCreateInfo == NULL, pCreateInfo->pApplication == NULL, or // pCreateInfo->pApplicationInfo->apiVersion == 0 all indicate that the application is diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h index c04d0371..aa2476ba 100644 --- a/loader/vk_loader_platform.h +++ b/loader/vk_loader_platform.h @@ -116,8 +116,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 -#define LOADER_PLATFORM_THREAD_ONCE_DECLARATION(var) pthread_once_t var = PTHREAD_ONCE_INIT; -#define LOADER_PLATFORM_THREAD_ONCE_DEFINITION(var) pthread_once_t var; static inline void loader_platform_thread_once(pthread_once_t *ctl, void (*func)(void)) { assert(func != NULL); assert(ctl != NULL); |
