[PATCH] Prevent crashes due to accessing X server from multiple threads

Vratislav Podzimek vpodzime at redhat.com
Fri Jul 18 07:28:33 UTC 2014


On Thu, 2014-07-17 at 13:21 -0400, David Shea wrote:
> On 07/17/2014 10:20 AM, Vratislav Podzimek wrote:
> > Gdk and Xklavier both access the X server, so we have to make sure those calls
> > happen from a single thread (the main loop one).
> >
> > Make the join_layout_variant function public now that it is used from a
> > different module.
> >
> > Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
> > ---
> >   anaconda                                |   2 -
> >   pyanaconda/keyboard.py                  | 371 +------------------------------
> >   pyanaconda/ui/gui/spokes/keyboard.py    |   9 +-
> >   pyanaconda/ui/gui/spokes/welcome.py     |   3 +-
> >   pyanaconda/ui/gui/xkl_wrapper.py        | 383 ++++++++++++++++++++++++++++++++
> >   tests/pyanaconda_tests/keyboard_test.py |   6 +-
> >   6 files changed, 400 insertions(+), 374 deletions(-)
> >   create mode 100644 pyanaconda/ui/gui/xkl_wrapper.py
> >
> 
> > diff --git a/pyanaconda/ui/gui/spokes/keyboard.py b/pyanaconda/ui/gui/spokes/keyboard.py
> > index f76fa84..3c4d351 100644
> > --- a/pyanaconda/ui/gui/spokes/keyboard.py
> > +++ b/pyanaconda/ui/gui/spokes/keyboard.py
> > @@ -26,6 +26,7 @@ from pyanaconda.ui.gui import GUIObject
> >   from pyanaconda.ui.gui.spokes import NormalSpoke
> >   from pyanaconda.ui.categories.localization import LocalizationCategory
> >   from pyanaconda.ui.gui.utils import gtk_call_once, escape_markup, gtk_batch_map, timed_action
> > +from pyanaconda.ui.gui.xkl_wrapper import XklWrapper
> >   from pyanaconda import keyboard
> >   from pyanaconda import flags
> >   from pyanaconda.i18n import _, N_, CN_
> > @@ -65,7 +66,7 @@ class AddLayoutDialog(GUIObject):
> >   
> >       def __init__(self, *args):
> >           GUIObject.__init__(self, *args)
> > -        self._xkl_wrapper = keyboard.XklWrapper.get_instance()
> > +        self._xkl_wrapper = XklWrapper.get_instance()
> >           self._chosen_layouts = []
> >   
> >       def matches_entry(self, model, itr, user_data=None):
> > @@ -184,7 +185,7 @@ class ConfigureSwitchingDialog(GUIObject):
> >   
> >       def __init__(self, *args):
> >           GUIObject.__init__(self, *args)
> > -        self._xkl_wrapper = keyboard.XklWrapper.get_instance()
> > +        self._xkl_wrapper = XklWrapper.get_instance()
> >   
> >           self._switchingOptsStore = self.builder.get_object("switchingOptsStore")
> >   
> > @@ -273,7 +274,7 @@ class KeyboardSpoke(NormalSpoke):
> >           NormalSpoke.__init__(self, *args)
> >           self._remove_last_attempt = False
> >           self._confirmed = False
> > -        self._xkl_wrapper = keyboard.XklWrapper.get_instance()
> > +        self._xkl_wrapper = XklWrapper.get_instance()
> >           self._add_dialog = None
> >           self._ready = False
> >   
> > @@ -607,7 +608,7 @@ class KeyboardSpoke(NormalSpoke):
> >               try:
> >                   self._addLayout(self._store, layout)
> >                   valid_layouts += layout
> > -            except keyboard.XklWrapperError:
> > +            except XklWrapperError:
> >                   log.error("Failed to add layout '%s'", layout)
> 
> The exception needs to be imported from xkl_wrapper.
Another good catch. Fixing locally as well. Thanks!

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list