[master][PATCH] Create the XklWrapper singleton in background

Vratislav Podzimek vpodzime at redhat.com
Fri Sep 13 14:43:11 UTC 2013


On Fri, 2013-09-13 at 10:08 -0400, David Shea wrote:
> On 09/13/2013 09:53 AM, David Shea wrote:
> > On 09/13/2013 08:08 AM, Vratislav Podzimek wrote:
> >> Creating the XklWrapper instance takes quite a lot of time (~4 
> >> seconds on a VM).
> >> Instead of doing when the first spoke needs it, we can create the 
> >> instance in
> >> background as soon as the X server is started. Since it includes a 
> >> lot of I/O
> >> operations, threading makes a real difference (at least 2 seconds on 
> >> a VM). But
> >> the main advantage is that this long action happens before we show 
> >> anything to
> >> user and not when some grey screen is shown.
> >> ---
> >>   anaconda                | 15 +++++++++++++++
> >>   pyanaconda/constants.py |  1 +
> >>   pyanaconda/keyboard.py  |  7 +++++--
> >>   3 files changed, 21 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/anaconda b/anaconda
> >> index 3e745e3..8b0dfc9 100755
> >> --- a/anaconda
> >> +++ b/anaconda
> >> @@ -85,6 +85,19 @@ def startSpiceVDAgent():
> >>       else:
> >>           log.info("Started spice-vdagent.")
> >>   +def backgroundXklWrapperInitialize():
> >> +    """
> >> +    Create the XklWrapper singleton instance in a separate thread to 
> >> save time
> >> +    when it's really needed.
> >> +
> >> +    """
> >> +
> >> +    from pyanaconda.constants import THREAD_XKL_WRAPPER_INIT
> >> +    from pyanaconda.keyboard import XklWrapper
> >> +    from pyanaconda.threads import threadMgr, AnacondaThread
> >> +
> >> +    threadMgr.add(AnacondaThread(name=THREAD_XKL_WRAPPER_INIT, 
> >> target=XklWrapper.get_instance))
> >> +
> >>   def startMetacityWM():
> >>       childpid = os.fork()
> >>       if not childpid:
> >> @@ -144,6 +157,8 @@ def doExtraX11Actions(runres):
> >>         startSpiceVDAgent()
> >>   +    backgroundXklWrapperInitialize()
> >> +
> >>   def setupPythonUpdates():
> >>       from distutils.sysconfig import get_python_lib
> >>       import gi.overrides
> >> diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
> >> index d4d8708..dfb9200 100644
> >> --- a/pyanaconda/constants.py
> >> +++ b/pyanaconda/constants.py
> >> @@ -117,6 +117,7 @@ THREAD_ISCSI_LOGIN = "AnaIscsiLoginThread"
> >>   THREAD_GEOLOCATION_REFRESH = "AnaGeolocationRefreshThread"
> >>   THREAD_DATE_TIME = "AnaDateTimeThread"
> >>   THREAD_TIME_INIT = "AnaTimeInitThread"
> >> +THREAD_XKL_WRAPPER_INIT = "AnaXklWrapperInitThread"
> >>     # Geolocation constants
> >>   diff --git a/pyanaconda/keyboard.py b/pyanaconda/keyboard.py
> >> index e5b7793..cf3f5d8 100644
> >> --- a/pyanaconda/keyboard.py
> >> +++ b/pyanaconda/keyboard.py
> >> @@ -38,6 +38,7 @@ import re
> >>   import shutil
> >>   import ctypes
> >>   import gettext
> >> +import threading
> >>     from collections import namedtuple
> >>   @@ -363,11 +364,13 @@ class XklWrapper(object):
> >>       """
> >>         _instance = None
> >> +    _instance_lock = threading.Lock()
> >>         @staticmethod
> >>       def get_instance():
> >> -        if not XklWrapper._instance:
> >> -            XklWrapper._instance = XklWrapper()
> >> +        with XklWrapper._instance_lock:
> >> +            if not XklWrapper._instance:
> >> +                XklWrapper._instance = XklWrapper()
> >>             return XklWrapper._instance
> > Ack
> ...except for the pylint errors in anaconda. threadMgr and 
> AnacondaThread have already been imported in the __main__ block
Yeah, but those imports are dangerous -- somebody may move or tweak them
without notifying that some function hunders of lines above needs them.
To be honest, I cannot decide what is better.

-- 
Vratislav Podzimek

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



More information about the anaconda-patches mailing list