user32: Avoid holding display_dc_section when creating display DC.
get_display_dc() may be locking display_dc_section at the end of user driver initialization in LoadCursorA() called from register_builtin_classes(). If the driver initialization initiated in CreateDCW() goes in parallel with the initialization started elsewhere without holding display_dc_section, the process can deadlock. Fixes random lockup on start in Hammerting. Signed-off-by: Paul Gofman <pgofman@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
358d4f5a91
commit
073b6dc240
|
@ -548,7 +548,18 @@ static BOOL init_entry_string( struct sysparam_entry *entry, const WCHAR *str )
|
||||||
HDC get_display_dc(void)
|
HDC get_display_dc(void)
|
||||||
{
|
{
|
||||||
EnterCriticalSection( &display_dc_section );
|
EnterCriticalSection( &display_dc_section );
|
||||||
if (!display_dc) display_dc = CreateDCW( L"DISPLAY", NULL, NULL, NULL );
|
if (!display_dc)
|
||||||
|
{
|
||||||
|
HDC dc;
|
||||||
|
|
||||||
|
LeaveCriticalSection( &display_dc_section );
|
||||||
|
dc = CreateDCW( L"DISPLAY", NULL, NULL, NULL );
|
||||||
|
EnterCriticalSection( &display_dc_section );
|
||||||
|
if (display_dc)
|
||||||
|
DeleteDC(dc);
|
||||||
|
else
|
||||||
|
display_dc = dc;
|
||||||
|
}
|
||||||
return display_dc;
|
return display_dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue