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/>