Instead of actually processing input in the handler, raise just enough of a dispatch exception to bomb out of request processing and handle input instead. This gets us back to exactly two input processing methods:
- input thread - main loop dispatch where the SIGIO handler is merely an optimization for the second case. Signed-off-by: Adam Jackson <[email protected]> --- hw/xfree86/common/xf86Events.c | 28 ++++++++++++++++++---------- 1 files changed, 18 insertions(+), 10 deletions(-) diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c index 5166adc..c42b5ce 100644 --- a/hw/xfree86/common/xf86Events.c +++ b/hw/xfree86/common/xf86Events.c @@ -302,29 +302,37 @@ xf86SigioReadInput(int fd, void *closure) } /* - * xf86AddEnabledDevice -- - * + * The host OS may or may not have working SIGIO handlers. If they don't, + * then the time_to_yield callback never gets called, and input will simply + * run out of the main loop whenever it gets around to it. */ + +static void +time_to_yield(int fd, void *closure) +{ + isItTimeToYield = 1; +} + void xf86AddEnabledDevice(InputInfoPtr pInfo) { - if (!xf86silkenMouseDisableFlag) + if (!xf86silkenMouseDisableFlag) { InputThreadRegisterDev(pInfo->fd, (void*) pInfo->read_input, pInfo); - else + } else { + xf86InstallSIGIOHandler(pInfo->fd, time_to_yield, NULL); AddEnabledDevice(pInfo->fd); + } } -/* - * xf86RemoveEnabledDevice -- - * - */ void xf86RemoveEnabledDevice(InputInfoPtr pInfo) { - if (!xf86silkenMouseDisableFlag) + if (!xf86silkenMouseDisableFlag) { InputThreadUnregisterDev(pInfo->fd); - else + } else { + xf86RemoveSIGIOHandler(pInfo->fd); RemoveEnabledDevice(pInfo->fd); + } } static int *xf86SignalIntercept = NULL; -- 1.7.3.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
