Module: wine Branch: master Commit: c5bdfdfb2da8c2cb414a3263939467d920b987cc URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5bdfdfb2da8c2cb414a326393...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 31 12:39:10 2009 +0200
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 023d691..77eed9e 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 cbce913..79aa8ea 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 e555e97..9cc9e90 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 db0f17e..81cb2bb 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 a88aa0c..3b2abe7 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 ); }
/***********************************************************************