Prevent repeatedly trying to load a non-existent library A hang in Chromium on MacOS seems related to attempting to load libGLES_CM repeatedly, since it doesn't exist. While dlopen() probably shouldn't be this slow, it could also be related to a sandboxing issue. In any case, this cl attempts to go around the issue by never trying to load a library twice. Bug chromium:904346 Change-Id: I65122f0fc9acb4f8db2a606437c61796464f72ad Reviewed-on: https://swiftshader-review.googlesource.com/c/22468 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libEGL/libEGL.hpp b/src/OpenGL/libEGL/libEGL.hpp index 7019338..4a95a5f 100644 --- a/src/OpenGL/libEGL/libEGL.hpp +++ b/src/OpenGL/libEGL/libEGL.hpp
@@ -90,7 +90,7 @@ private: LibEGLexports *loadExports() { - if(!libEGL) + if(!loadLibraryAttempted && !libEGL) { #if defined(_WIN32) #if defined(__LP64__) @@ -126,6 +126,8 @@ auto libEGL_swiftshader = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGL_swiftshader"); libEGLexports = libEGL_swiftshader(); } + + loadLibraryAttempted = true; } return libEGLexports; @@ -133,6 +135,7 @@ void *libEGL = nullptr; LibEGLexports *libEGLexports = nullptr; + bool loadLibraryAttempted = false; }; #endif // libEGL_hpp
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp index ae6237b..80ce1f2 100644 --- a/src/OpenGL/libGLES_CM/libGLES_CM.hpp +++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -251,7 +251,7 @@ private: LibGLES_CMexports *loadExports() { - if(!libGLES_CM) + if(!loadLibraryAttempted && !libGLES_CM) { #if defined(_WIN32) #if defined(__LP64__) @@ -287,6 +287,8 @@ auto libGLES_CM_swiftshader = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CM_swiftshader"); libGLES_CMexports = libGLES_CM_swiftshader(); } + + loadLibraryAttempted = true; } return libGLES_CMexports; @@ -294,6 +296,7 @@ void *libGLES_CM = nullptr; LibGLES_CMexports *libGLES_CMexports = nullptr; + bool loadLibraryAttempted = false; }; #endif // libGLES_CM_hpp
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp index f029f38..24d9e92 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.hpp +++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -276,7 +276,7 @@ private: LibGLESv2exports *loadExports() { - if(!libGLESv2) + if(!loadLibraryAttempted && !libGLESv2) { #if defined(_WIN32) #if defined(__LP64__) @@ -312,6 +312,8 @@ auto libGLESv2_swiftshader = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2_swiftshader"); libGLESv2exports = libGLESv2_swiftshader(); } + + loadLibraryAttempted = true; } return libGLESv2exports; @@ -319,6 +321,7 @@ void *libGLESv2 = nullptr; LibGLESv2exports *libGLESv2exports = nullptr; + bool loadLibraryAttempted = false; }; #endif // libGLESv2_hpp