Modified files:
dlls/gdi : driver.c
loader : module.c
Log message:
Codeweavers
Replace Rtl...PebLock with Rtl...CriticalSection.
Slight change to library loading.
Index: dlls/gdi/driver.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/driver.c,v
retrieving revision 1.6
diff -u -r1.6 driver.c
--- dlls/gdi/driver.c 2001/09/14 01:00:57 1.6
+++ dlls/gdi/driver.c 2002/01/26 15:02:42
@@ -27,8 +27,8 @@
static struct graphics_driver *first_driver;
static struct graphics_driver *display_driver;
static const DC_FUNCTIONS *win16_driver;
+static CRITICAL_SECTION driver_section = CRITICAL_SECTION_INIT( "driver_section" );
-
/**********************************************************************
* create_driver
*
@@ -207,13 +207,13 @@
HMODULE module;
struct graphics_driver *driver;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &driver_section );
/* display driver is a special case */
if (!strcasecmp( name, "display" ))
{
driver = load_display_driver();
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
return &driver->funcs;
}
@@ -224,7 +224,7 @@
if (driver->module == module)
{
driver->count++;
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
return &driver->funcs;
}
}
@@ -233,19 +233,19 @@
if (!(module = LoadLibraryA( name )))
{
if (!win16_driver) win16_driver = WIN16DRV_Init();
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
return win16_driver;
}
if (!(driver = create_driver( module )))
{
FreeLibrary( module );
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
return NULL;
}
TRACE( "loaded driver %p for %s\n", driver, name );
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
return &driver->funcs;
}
@@ -259,7 +259,7 @@
{
struct graphics_driver *driver;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &driver_section );
if (funcs != win16_driver)
{
for (driver = first_driver; driver; driver = driver->next)
@@ -267,7 +267,7 @@
if (!driver) ERR( "driver not found, trouble ahead\n" );
driver->count++;
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
return funcs;
}
@@ -281,7 +281,7 @@
{
struct graphics_driver *driver;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &driver_section );
if (funcs == win16_driver) goto done;
@@ -300,7 +300,7 @@
FreeLibrary( driver->module );
HeapFree( GetProcessHeap(), 0, driver );
done:
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &driver_section );
}
Index: loader/module.c
===================================================================
RCS file: /home/wine/wine/loader/module.c,v
retrieving revision 1.145
diff -u -r1.145 module.c
--- loader/module.c 2002/01/18 18:58:08 1.145
+++ loader/module.c 2002/01/26 15:02:43
@@ -29,6 +29,8 @@
static int free_lib_count; /* recursion depth of FreeLibrary calls */
static int process_detaching; /* set on process detach to avoid deadlocks with thread detach */
+static CRITICAL_SECTION loader_section = CRITICAL_SECTION_INIT( "loader_section" );
+
/***********************************************************************
* wait_input_idle
*
@@ -176,9 +178,13 @@
BOOL retv = TRUE;
int i;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
- if (!wm) wm = exe_modref;
+ if (!wm)
+ {
+ wm = exe_modref;
+ PE_InitTls();
+ }
assert( wm );
/* prevent infinite recursion in case of cyclical dependencies */
@@ -221,7 +227,7 @@
TRACE("(%s,%p) - END\n", wm->modname, lpReserved );
done:
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
return retv;
}
@@ -236,7 +242,7 @@
{
WINE_MODREF *wm;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
if (bForceDetach) process_detaching = 1;
do
{
@@ -258,7 +264,7 @@
}
} while ( wm );
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
}
/*************************************************************************
@@ -276,8 +282,10 @@
if (process_detaching) return;
/* FIXME: there is still a race here */
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
+ PE_InitTls();
+
for ( wm = MODULE_modref_list; wm; wm = wm->next )
if ( !wm->next )
break;
@@ -292,7 +300,7 @@
MODULE_InitDLL( wm, DLL_THREAD_ATTACH, lpReserved );
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
}
/*************************************************************************
@@ -310,7 +318,7 @@
if (process_detaching) return;
/* FIXME: there is still a race here */
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
for ( wm = MODULE_modref_list; wm; wm = wm->next )
{
@@ -322,7 +330,7 @@
MODULE_InitDLL( wm, DLL_THREAD_DETACH, lpReserved );
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
}
/****************************************************************************
@@ -335,7 +343,7 @@
WINE_MODREF *wm;
BOOL retval = TRUE;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
wm = MODULE32_LookupHMODULE( hModule );
if ( !wm )
@@ -343,7 +351,7 @@
else
wm->flags |= WINE_MODREF_NO_DLL_CALLS;
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
return retval;
}
@@ -1231,13 +1239,13 @@
{
WINE_MODREF *wm;
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
lpFileName[0] = 0;
if ((wm = MODULE32_LookupHMODULE( hModule )))
lstrcpynA( lpFileName, wm->filename, size );
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
TRACE("%s\n", lpFileName );
return strlen(lpFileName);
}
@@ -1284,7 +1292,18 @@
NULL, OPEN_EXISTING, 0, 0 );
if (hFile != INVALID_HANDLE_VALUE)
{
- hmod = PE_LoadImage( hFile, filename, flags );
+ DWORD type;
+ MODULE_GetBinaryType( hFile, filename, &type );
+ if (type == SCS_32BIT_BINARY)
+ {
+ HANDLE mapping = CreateFileMappingA( hFile, NULL, PAGE_READONLY,
+ 0, 0, NULL );
+ if (mapping)
+ {
+ hmod = (HMODULE)MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
+ CloseHandle( mapping );
+ }
+ }
CloseHandle( hFile );
}
if (hmod) return (HMODULE)((ULONG_PTR)hmod + 1);
@@ -1293,7 +1312,7 @@
/* Fallback to normal behaviour */
}
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
wm = MODULE_LoadLibraryExA( libname, hfile, flags );
if ( wm )
@@ -1307,7 +1326,7 @@
}
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
return wm ? wm->module : 0;
}
@@ -1381,7 +1400,7 @@
if ( !filename ) return NULL;
*filename = 0; /* Just in case we don't set it before goto error */
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
if ((flags & LOAD_WITH_ALTERED_SEARCH_PATH) && FILE_contains_path(libname))
{
@@ -1459,7 +1478,7 @@
HeapFree ( GetProcessHeap(), 0, (LPSTR)libdir );
libdir = NULL;
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
HeapFree ( GetProcessHeap(), 0, filename );
return pwm;
}
@@ -1511,7 +1530,7 @@
HeapFree ( GetProcessHeap(), 0, (LPSTR)libdir );
libdir = NULL;
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
SetLastError( err ); /* restore last error */
HeapFree ( GetProcessHeap(), 0, filename );
return pwm;
@@ -1527,7 +1546,7 @@
HeapFree ( GetProcessHeap(), 0, (LPSTR)libdir );
libdir = NULL;
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
WARN("Failed to load module '%s'; error=0x%08lx\n", filename, GetLastError());
HeapFree ( GetProcessHeap(), 0, filename );
return NULL;
@@ -1634,13 +1653,13 @@
return TRUE;
}
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
free_lib_count++;
if ((wm = MODULE32_LookupHMODULE( hLibModule ))) retv = MODULE_FreeLibrary( wm );
free_lib_count--;
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
return retv;
}
@@ -1818,13 +1837,13 @@
else
TRACE_(win32)("(%08lx,%p)\n",(DWORD)hModule,function);
- RtlAcquirePebLock();
+ RtlEnterCriticalSection( &loader_section );
if ((wm = MODULE32_LookupHMODULE( hModule )))
{
retproc = wm->find_export( wm, function, snoop );
if (!retproc) SetLastError(ERROR_PROC_NOT_FOUND);
}
- RtlReleasePebLock();
+ RtlLeaveCriticalSection( &loader_section );
return retproc;
}