[master][PATCH] Create the XklWrapper singleton in background
David Shea
dshea at redhat.com
Fri Sep 13 14:08:43 UTC 2013
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
More information about the anaconda-patches
mailing list