[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