[PATCH] Fix drain_console unregistration

Peter Hutterer peter.hutterer at who-t.net
Sun Oct 16 19:08:31 PDT 2011


sigh. I had a fix for this back in August but it never made it into master
http://lists.freedesktop.org/archives/xorg-devel/2011-August/024354.html

On Tue, Oct 11, 2011 at 09:11:18AM +0200, Tomáš Trnka wrote:
> Bug introduced by 9dca441670d261a9a9fb6108960ed48f3d58fb7f
> xfree86: add a hook to replace the new console handler.
> 
> console_handler was not being set, making the server eat up CPU spinning
> in WaitForSomething selecting consoleFd over and over again, every time
> trying to unregister drain_console without success due to
> console_handler being NULL.
> 
> Let's just fix the unregistration in xf86SetConsoleHandler() and use that.
> 
> But wait, there could be a catch: If some driver replaced the handler using
> xf86SetConsoleHandler(), the unregistration in xf86CloseConsole will unregister
> that one. I don't understand Xorg well enough to know whether this poses a
> problem (could mess up driver deinit somehow or something like that). As it is,
> xf86SetConsoleHandler() doesn't offer any way to prevent this (i.e. check which
> handler is currently registered).

I don't think we really handle multiple console handlers so we probably
don't need to worry about this.

Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>, I've merged this
into my tree. thanks.

Cheers,
  Peter

> I had been using it for two days on my machine that previously hit 100% CPU
> several times a day. That has now gone away without any new problems appearing.
> 
> Signed-off-by: Tomas Trnka <tomastrnka at gmx.com>
> ---
>  hw/xfree86/common/xf86Events.c         |    9 ++++-----
>  hw/xfree86/os-support/linux/lnx_init.c |   14 ++++++--------
>  2 files changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
> index 84c0d18..8511ea1 100644
> --- a/hw/xfree86/common/xf86Events.c
> +++ b/hw/xfree86/common/xf86Events.c
> @@ -603,16 +603,15 @@ xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data)
>  InputHandlerProc
>  xf86SetConsoleHandler(InputHandlerProc proc, pointer data)
>  {
> -    static InputHandlerProc handler = NULL;
> -    InputHandlerProc old_handler = handler;
> +    static IHPtr handler = NULL;
> +    IHPtr old_handler = handler;
>  
>      if (old_handler)
>          xf86RemoveGeneralHandler(old_handler);
>  
> -    xf86AddGeneralHandler(xf86Info.consoleFd, proc, data);
> -    handler = proc;
> +    handler = xf86AddGeneralHandler(xf86Info.consoleFd, proc, data);
>  
> -    return old_handler;
> +    return (old_handler) ? old_handler->ihproc : NULL;
>  }
>  
>  static void
> diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
> index 77dfb2f..adcc467 100644
> --- a/hw/xfree86/os-support/linux/lnx_init.c
> +++ b/hw/xfree86/os-support/linux/lnx_init.c
> @@ -47,15 +47,12 @@ static char vtname[11];
>  static struct termios tty_attr; /* tty state to restore */
>  static int tty_mode; /* kbd mode to restore */
>  
> -static void *console_handler;
> -
>  static void
>  drain_console(int fd, void *closure)
>  {
>      errno = 0;
>      if (tcflush(fd, TCIOFLUSH) == -1 && errno == EIO) {
> -	xf86RemoveGeneralHandler(console_handler);
> -	console_handler = NULL;
> +        xf86SetConsoleHandler(NULL, NULL);
>      }
>  }
>  
> @@ -259,10 +256,11 @@ xf86CloseConsole(void)
>          return;
>      }
>  
> -    if (console_handler) {
> -	xf86RemoveGeneralHandler(console_handler);
> -	console_handler = NULL;
> -    };
> +    /*
> +     * unregister the drain_console handler
> +     * - what to do if someone else changed it in the meantime?
> +     */
> +    xf86SetConsoleHandler(NULL, NULL);
>  
>      /* Back to text mode ... */
>      SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT));
> -- 
> 1.7.6.4
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list