Alexandre Julliard : winedos: Release the 16-bit lock before calling ExitThread.
Alexandre Julliard
julliard at winehq.org
Tue Mar 31 12:19:21 CDT 2009
Module: wine
Branch: master
Commit: c5bdfdfb2da8c2cb414a3263939467d920b987cc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5bdfdfb2da8c2cb414a3263939467d920b987cc
Author: Alexandre Julliard <julliard at 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 );
}
/***********************************************************************
More information about the wine-cvs
mailing list