From c5bdfdfb2da8c2cb414a3263939467d920b987cc Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 31 Mar 2009 12:39:10 +0200 Subject: [PATCH] winedos: Release the 16-bit lock before calling ExitThread. This avoids deadlocks with the loader lock. --- dlls/winedos/dosexe.h | 1 + dlls/winedos/int21.c | 4 ++-- dlls/winedos/int31.c | 4 ++-- dlls/winedos/interrupts.c | 2 +- dlls/winedos/module.c | 16 ++++++++++++++-- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/dlls/winedos/dosexe.h b/dlls/winedos/dosexe.h index 023d69179b8..77eed9e5d20 100644 --- a/dlls/winedos/dosexe.h +++ b/dlls/winedos/dosexe.h @@ -352,6 +352,7 @@ extern BOOL WINAPI MZ_Current( void ); extern void WINAPI MZ_AllocDPMITask( void ); extern void WINAPI MZ_RunInThread( PAPCFUNC proc, ULONG_PTR arg ); extern BOOL DOSVM_IsWin16(void); +extern void DOSVM_Exit( WORD retval ); /* dosvm.c */ extern void DOSVM_SendQueuedEvents( CONTEXT86 * ); diff --git a/dlls/winedos/int21.c b/dlls/winedos/int21.c index cbce913e98e..79aa8ea568c 100644 --- a/dlls/winedos/int21.c +++ b/dlls/winedos/int21.c @@ -4176,7 +4176,7 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context ) case 0x00: /* TERMINATE PROGRAM */ TRACE("TERMINATE PROGRAM\n"); if (DOSVM_IsWin16()) - ExitThread( 0 ); + DOSVM_Exit( 0 ); else if(ISV86(context)) MZ_Exit( context, FALSE, 0 ); else @@ -5050,7 +5050,7 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context ) case 0x4c: /* "EXIT" - TERMINATE WITH RETURN CODE */ TRACE( "EXIT with return code %d\n", AL_reg(context) ); if (DOSVM_IsWin16()) - ExitThread( AL_reg(context) ); + DOSVM_Exit( AL_reg(context) ); else if(ISV86(context)) MZ_Exit( context, FALSE, AL_reg(context) ); else diff --git a/dlls/winedos/int31.c b/dlls/winedos/int31.c index e555e97c5a5..9cc9e905b4e 100644 --- a/dlls/winedos/int31.c +++ b/dlls/winedos/int31.c @@ -626,11 +626,11 @@ static void StartPM( CONTEXT86 *context ) TRACE( "Protected mode DOS program is terminating\n" ); /* - * FIXME: Instead of calling ExitThread, we should release all + * FIXME: Instead of calling DOSVM_Exit, we should release all * allocated protected mode resources and call MZ_Exit * using real mode context. See DPMI specification. */ - ExitThread( DPMI_retval ); + DOSVM_Exit( DPMI_retval ); #if 0 wine_ldt_free_entries( psp->environment, 1 ); diff --git a/dlls/winedos/interrupts.c b/dlls/winedos/interrupts.c index db0f17e1eda..81cb2bb0e75 100644 --- a/dlls/winedos/interrupts.c +++ b/dlls/winedos/interrupts.c @@ -951,7 +951,7 @@ static void WINAPI DOSVM_Int1aHandler( CONTEXT86 *context ) static void WINAPI DOSVM_Int20Handler( CONTEXT86 *context ) { if (DOSVM_IsWin16()) - ExitThread( 0 ); + DOSVM_Exit( 0 ); else if(ISV86(context)) MZ_Exit( context, TRUE, 0 ); else diff --git a/dlls/winedos/module.c b/dlls/winedos/module.c index a88aa0cbb6a..3b2abe708ef 100644 --- a/dlls/winedos/module.c +++ b/dlls/winedos/module.c @@ -64,6 +64,18 @@ BOOL DOSVM_IsWin16(void) return DOSVM_isdosexe ? FALSE : TRUE; } +/********************************************************************** + * DOSVM_Exit + */ +void DOSVM_Exit( WORD retval ) +{ + DWORD count; + + ReleaseThunkLock( &count ); + ExitThread( retval ); +} + + #ifdef MZ_SUPPORTED #ifdef HAVE_SYS_MMAN_H @@ -731,7 +743,7 @@ void WINAPI MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval ) } else TRACE("killing DOS task\n"); } - ExitThread( retval ); + DOSVM_Exit( retval ); } @@ -785,7 +797,7 @@ void WINAPI MZ_RunInThread( PAPCFUNC proc, ULONG_PTR arg ) */ void WINAPI MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval ) { - ExitThread( retval ); + DOSVM_Exit( retval ); } /*********************************************************************** -- 2.11.4.GIT