# HG changeset patch # User Eli Zaretskii # Date 897841173 0 # Node ID c19803db4a93dcfc594fab0a804c28de8dd950a8 # Parent a85ad07a6e4bf5d44354becd00eead0db1e401a4 (dos_set_keyboard): Call Int 2Fh via the DPMI server, not directly. (dos_yield_time_slice): New function. (sys_select): Use it instead of __dpmi_yield. diff -r a85ad07a6e4b -r c19803db4a93 src/msdos.c --- a/src/msdos.c Sun Jun 14 15:34:02 1998 +0000 +++ b/src/msdos.c Sun Jun 14 16:19:33 1998 +0000 @@ -1272,11 +1272,13 @@ int always; { int i; - union REGS regs; - - /* See if Keyb.Com is installed (for international keyboard support). */ + _go32_dpmi_registers regs; + + /* See if Keyb.Com is installed (for international keyboard support). + Note: calling Int 2Fh via int86 wedges the DOS box on some versions + of Windows 9X! So don't do that! */ regs.x.ax = 0xad80; - int86 (0x2f, ®s, ®s); + _go32_dpmi_simulate_int (0x2f, ®s); if (regs.h.al == 0xff) international_keyboard = 1; @@ -3421,6 +3423,25 @@ && (long)(time).tv_usec <= 0)) #endif +/* This yields the rest of the current time slice to the task manager. + It should be called by any code which knows that it has nothing + useful to do except idle. + + I don't use __dpmi_yield here, since versions of library before 2.02 + called Int 2Fh/AX=1680h there in a way that would wedge the DOS box + on some versions of Windows 9X. */ + +void +dos_yield_time_slice (void) +{ + _go32_dpmi_registers r; + + r.x.ax = 0x1680; + r.x.ss = r.x.sp = r.x.flags = 0; + _go32_dpmi_simulate_int (0x2f, &r); + if (r.h.al == 0x80) + errno = ENOSYS; +} /* Only event queue is checked. */ /* We don't have to call timer_check here @@ -3454,9 +3475,7 @@ { while (!detect_input_pending ()) { -#if __DJGPP__ >= 2 - __dpmi_yield (); -#endif + dos_yield_time_slice (); } } else @@ -3482,9 +3501,7 @@ if (EMACS_TIME_ZERO_OR_NEG_P (*timeout)) return 0; cllast = clnow; -#if __DJGPP__ >= 2 - __dpmi_yield (); -#endif + dos_yield_time_slice (); } }