Paul Gofman : kernelbase: Don't use loader lock for loading libraries as data files.

Alexandre Julliard julliard at winehq.org
Tue Sep 28 16:01:56 CDT 2021


Module: wine
Branch: master
Commit: 5f6edba5bb5dd36023ad5b0cbe75f6ad076ab7b3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5f6edba5bb5dd36023ad5b0cbe75f6ad076ab7b3

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Tue Sep 28 02:58:45 2021 +0300

kernelbase: Don't use loader lock for loading libraries as data files.

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernelbase/loader.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c
index da139e91176..53c6750e668 100644
--- a/dlls/kernelbase/loader.c
+++ b/dlls/kernelbase/loader.c
@@ -48,6 +48,14 @@ struct exclusive_datafile
 };
 static struct list exclusive_datafile_list = LIST_INIT( exclusive_datafile_list );
 
+static CRITICAL_SECTION exclusive_datafile_list_section;
+static CRITICAL_SECTION_DEBUG critsect_debug =
+{
+    0, 0, &exclusive_datafile_list_section,
+    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
+      0, 0, { (DWORD_PTR)(__FILE__ ": exclusive_datafile_list_section") }
+};
+static CRITICAL_SECTION exclusive_datafile_list_section = { &critsect_debug, -1, 0, 0, 0, 0 };
 
 /***********************************************************************
  * Modules
@@ -120,7 +128,9 @@ static BOOL load_library_as_datafile( LPCWSTR load_path, DWORD flags, LPCWSTR na
             if (!datafile) goto failed;
             datafile->module = *mod_ret;
             datafile->file   = file;
+            RtlEnterCriticalSection( &exclusive_datafile_list_section );
             list_add_head( &exclusive_datafile_list, &datafile->entry );
+            RtlLeaveCriticalSection( &exclusive_datafile_list_section );
             TRACE( "delaying close %p for module %p\n", datafile->file, datafile->module );
             return TRUE;
         }
@@ -154,14 +164,8 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags )
     if (flags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
                  LOAD_LIBRARY_AS_IMAGE_RESOURCE))
     {
-        ULONG_PTR magic;
-
-        LdrLockLoaderLock( 0, NULL, &magic );
-        if (!LdrGetDllHandle( load_path, flags, libname, &module ))
-            LdrAddRefDll( 0, module );
-        else
+        if (LdrGetDllHandleEx( 0, load_path, NULL, libname, &module ))
             load_library_as_datafile( load_path, flags, libname->Buffer, &module );
-        LdrUnlockLoaderLock( 0, magic );
     }
     else
     {
@@ -242,9 +246,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeLibrary( HINSTANCE module )
         if ((ULONG_PTR)module & 1)
         {
             struct exclusive_datafile *file;
-            ULONG_PTR magic;
 
-            LdrLockLoaderLock( 0, NULL, &magic );
+            RtlEnterCriticalSection( &exclusive_datafile_list_section );
             LIST_FOR_EACH_ENTRY( file, &exclusive_datafile_list, struct exclusive_datafile, entry )
             {
                 if (file->module != module) continue;
@@ -254,7 +257,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeLibrary( HINSTANCE module )
                 HeapFree( GetProcessHeap(), 0, file );
                 break;
             }
-            LdrUnlockLoaderLock( 0, magic );
+            RtlLeaveCriticalSection( &exclusive_datafile_list_section );
         }
         return UnmapViewOfFile( ptr );
     }




More information about the wine-cvs mailing list