mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 11:59:01 +02:00

The method "prioritized" returns a list sorted by the value of the "priority" field, in descending order. However, if several list items have the same priority, the ordering of those items within the priority-sorted list becomes random. As a consequence, we may end up with a non-deterministic oe-terminal spawning, as several terminals have the same priority. So running commands such as $ bitbake xxx -cdevshell $ bitbake yyy -cmenuconfig may spawn a different terminal each time, for example sometimes Gnome and sometimes Konsole as hey have the same priority. Rather than modifying the priorities so they all differ, we sub-sort the list based on (terminal) names. This way we achieve a deterministic outcome. [YOCTO#10938] (From OE-Core rev: 82ae62f28dd2d5fb2fb261478ac6161315ac6c38) Signed-off-by: Juro Bystricky <juro.bystricky@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
|
|
class ClassRegistryMeta(type):
|
|
"""Give each ClassRegistry their own registry"""
|
|
def __init__(cls, name, bases, attrs):
|
|
cls.registry = {}
|
|
type.__init__(cls, name, bases, attrs)
|
|
|
|
class ClassRegistry(type, metaclass=ClassRegistryMeta):
|
|
"""Maintain a registry of classes, indexed by name.
|
|
|
|
Note that this implementation requires that the names be unique, as it uses
|
|
a dictionary to hold the classes by name.
|
|
|
|
The name in the registry can be overridden via the 'name' attribute of the
|
|
class, and the 'priority' attribute controls priority. The prioritized()
|
|
method returns the registered classes in priority order.
|
|
|
|
Subclasses of ClassRegistry may define an 'implemented' property to exert
|
|
control over whether the class will be added to the registry (e.g. to keep
|
|
abstract base classes out of the registry)."""
|
|
priority = 0
|
|
def __init__(cls, name, bases, attrs):
|
|
super(ClassRegistry, cls).__init__(name, bases, attrs)
|
|
try:
|
|
if not cls.implemented:
|
|
return
|
|
except AttributeError:
|
|
pass
|
|
|
|
try:
|
|
cls.name
|
|
except AttributeError:
|
|
cls.name = name
|
|
cls.registry[cls.name] = cls
|
|
|
|
@classmethod
|
|
def prioritized(tcls):
|
|
return sorted(list(tcls.registry.values()),
|
|
key=lambda v: (v.priority, v.name), reverse=True)
|
|
|
|
def unregister(cls):
|
|
for key in cls.registry.keys():
|
|
if cls.registry[key] is cls:
|
|
del cls.registry[key]
|