winedos / Fix DOSVM_Wait

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Well, well. Sometimes the correct fix is simply too easy.




Changelog:
  Pending timer interrupts no longer deadlock DOSVM_Wait.
  Restored interrupt priorities to correct values.




Index: dlls/winedos/dosexe.h
===================================================================
RCS file: /home/wine/wine/dlls/winedos/dosexe.h,v
retrieving revision 1.25
diff -u -r1.25 dosexe.h
--- dlls/winedos/dosexe.h	2 May 2003 20:12:52 -0000	1.25
+++ dlls/winedos/dosexe.h	4 Jun 2003 19:54:59 -0000
@@ -75,8 +75,8 @@
 typedef void (WINAPI *RMCBPROC)(CONTEXT86*);
 typedef void (WINAPI *INTPROC)(CONTEXT86*);
 
-#define DOS_PRIORITY_REALTIME 1  /* IRQ0 - FIXME: should be 0 */
-#define DOS_PRIORITY_KEYBOARD 0  /* IRQ1 - FIXME: should be 1 */
+#define DOS_PRIORITY_REALTIME 0  /* IRQ0 */
+#define DOS_PRIORITY_KEYBOARD 1  /* IRQ1 */
 #define DOS_PRIORITY_VGA      2  /* IRQ9 */
 #define DOS_PRIORITY_MOUSE    5  /* IRQ12 */
 #define DOS_PRIORITY_SERIAL   10 /* IRQ4 */




Index: dlls/winedos/dosvm.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/dosvm.c,v
retrieving revision 1.36
diff -u -r1.36 dosvm.c
--- dlls/winedos/dosvm.c	4 May 2003 02:25:21 -0000	1.36
+++ dlls/winedos/dosvm.c	4 Jun 2003 19:55:04 -0000
@@ -272,16 +272,18 @@
     {
         /*
          * FIXME: This does not work in protected mode DOS programs.
-         * FIXME: If we have pending IRQ which has 16-bit handler,
-         *        DOSVM_SendQueuedEvents may stuck in which case application
-         *        deadlocks. This is why keyboard events must have top 
-         *        priority (default timer IRQ handler is 16-bit code).
          * FIXME: Critical section locking is broken.
          */
         CONTEXT86 context = *waitctx;
         IF_SET(&context);
         SET_PEND(&context);
+        context.SegCs = 0;
+        context.Eip = 0;
+
         DOSVM_SendQueuedEvents(&context);
+
+        if(context.SegCs || context.Eip)
+            DPMI_CallRMProc( &context, NULL, 0, TRUE );
     }
     else
     {




-- 
Jukka Heinonen <http://www.iki.fi/jhei/>


[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux