1
0
mirror of https://github.com/ARM-software/devlib.git synced 2025-01-31 02:00:45 +00:00

target: Make __getstate__ more future-proof

Remove all the tls_property from the state, as they will be recreated
automatically.
This commit is contained in:
Douglas Raillard 2021-11-12 11:19:04 +00:00 committed by Marc Bonnici
parent 9bd76fd8af
commit 3fe105ffb7

View File

@ -31,6 +31,7 @@ import threading
import uuid import uuid
import xml.dom.minidom import xml.dom.minidom
import copy import copy
import inspect
from collections import namedtuple, defaultdict from collections import namedtuple, defaultdict
from contextlib import contextmanager from contextlib import contextmanager
from pipes import quote from pipes import quote
@ -56,7 +57,7 @@ from devlib.utils.android import AdbConnection, AndroidProperties, LogcatMonitor
from devlib.utils.misc import memoized, isiterable, convert_new_lines, groupby_value from devlib.utils.misc import memoized, isiterable, convert_new_lines, groupby_value
from devlib.utils.misc import commonprefix, merge_lists from devlib.utils.misc import commonprefix, merge_lists
from devlib.utils.misc import ABI_MAP, get_cpu_name, ranges_to_list from devlib.utils.misc import ABI_MAP, get_cpu_name, ranges_to_list
from devlib.utils.misc import batch_contextmanager, tls_property, nullcontext from devlib.utils.misc import batch_contextmanager, tls_property, _BoundTLSProperty, nullcontext
from devlib.utils.types import integer, boolean, bitmask, identifier, caseless_string, bytes_regex from devlib.utils.types import integer, boolean, bitmask, identifier, caseless_string, bytes_regex
@ -337,12 +338,18 @@ class Target(object):
self.connect() self.connect()
def __getstate__(self): def __getstate__(self):
# tls_property will recreate the underlying value automatically upon
# access and is typically used for dynamic content that cannot be
# pickled or should not transmitted to another thread.
ignored = {
k
for k, v in inspect.getmembers(self.__class__)
if isinstance(v, _BoundTLSProperty)
}
return { return {
k: v k: v
for k, v in self.__dict__.items() for k, v in self.__dict__.items()
# Avoid sharing the connection instance with the original target, if k not in ignored
# so that each target can live its own independent life
if k != '_conn'
} }
# connection and initialization # connection and initialization