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