[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: Fix for CPU-hogging rdesktops



What about, instead:

-        while (XCheckWindowEvent(display, wnd, ~0, &event))
+        while (XCheckMaskEvent(display, ~0, &event))

Does this fix it for you?

	Matt


On Fri, Oct 19, 2001 at 03:42:06PM +0200, Per Kristian Hove wrote:
> When rdesktop is started by a button or menu choice in your
> window manager (not from an xterm or similar), and the user logs
> out of X without closing rdesktop first, rdesktop often hangs
> and eats up all the available CPU. The following patch (also
> attached) cures this:
> 
> diff -ru xwin.c.orig xwin.c
> --- xwin.c.orig	Thu Aug 23 10:40:05 2001
> +++ xwin.c	Fri Oct 19 15:07:18 2001
> @@ -666,6 +751,11 @@
>              ui_ungrab_keyboard();
>            break;
>  	}
> +    }
> +
> +  if (ui_pending() && XNextEvent(display, &event))
> +    {
> +      DEBUG ("Got event type %d\n", event.type);
>      }
>  }
> 
> 
> The reason why rdesktop hangs is that the ui_process_events()
> (which is called as long as there is events in the X event
> queue) only checks for (and removes) events related to the
> rdesktop window.
> 
> When logging out of X without exiting rdesktop, rdesktop will
> receive a "Oops, connection to X server broken" event. This
> event will never be removed from the event queue (it's not
> related to a specific window), and the result is that
> ui_process_events() gets called over and over again (but doing
> nothing), hogging the CPU.
> 
> With this patch, rdesktop exits "cleanly" with the usual message
> "X connection to :2.1 broken (explicit kill or server shutdown)."
> if it loses its connection with the X server.
> 
> 
> -- 
> Per Kristian Hove <Per.Hove@math.ntnu.no>
> Principal engineer
> Dept. of Mathematical Sciences
> Norwegian University of Science and Technology

> diff -ru xwin.c.orig xwin.c
> --- xwin.c.orig	Thu Aug 23 10:40:05 2001
> +++ xwin.c	Fri Oct 19 15:07:18 2001
> @@ -666,6 +751,11 @@
>              ui_ungrab_keyboard();
>            break;
>  	}
> +    }
> +
> +  if (ui_pending() && XNextEvent(display, &event))
> +    {
> +      DEBUG ("Got event type %d\n", event.type);
>      }
>  }
>