diff --git a/devlib/target.py b/devlib/target.py index e3765a3..2b8296c 100644 --- a/devlib/target.py +++ b/devlib/target.py @@ -53,7 +53,7 @@ from devlib.utils.android import AdbConnection, AndroidProperties, LogcatMonitor from devlib.utils.misc import memoized, isiterable, convert_new_lines 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 batch_contextmanager +from devlib.utils.misc import batch_contextmanager, tls_property from devlib.utils.types import integer, boolean, bitmask, identifier, caseless_string, bytes_regex @@ -214,22 +214,19 @@ class Target(object): cmd = "cat /proc/self/smaps | {0} grep KernelPageSize | {0} head -n 1 | {0} awk '{{ print $2 }}'" return int(self.execute(cmd.format(self.busybox))) - @property - def conn(self): - if self._connections: - tid = id(threading.current_thread()) - if tid not in self._connections: - self._connections[tid] = self.get_connection() - return self._connections[tid] - else: - return None - @property def shutils(self): if self._shutils is None: self._setup_shutils() return self._shutils + @tls_property + def _conn(self): + return self.get_connection() + + # Add a basic property that does not require calling to get the value + conn = _conn.basic_property + def __init__(self, connection_settings=None, platform=None, @@ -242,6 +239,7 @@ class Target(object): conn_cls=None, is_container=False ): + self._is_rooted = None self.connection_settings = connection_settings or {} # Set self.platform: either it's given directly (by platform argument) @@ -271,7 +269,6 @@ class Target(object): self._installed_binaries = {} self._installed_modules = {} self._cache = {} - self._connections = {} self._shutils = None self._file_transfer_cache = None self.busybox = None @@ -290,8 +287,9 @@ class Target(object): def connect(self, timeout=None, check_boot_completed=True): self.platform.init_target_connection(self) - tid = id(threading.current_thread()) - self._connections[tid] = self.get_connection(timeout=timeout) + # Forcefully set the thread-local value for the connection, with the + # timeout we want + self.conn = self.get_connection(timeout=timeout) if check_boot_completed: self.wait_boot_complete(timeout) self._resolve_paths() @@ -304,9 +302,9 @@ class Target(object): self._install_module(get_module('bl')) def disconnect(self): - for conn in self._connections.values(): + connections = self._conn.get_all_values() + for conn in connections: conn.close() - self._connections = {} def get_connection(self, timeout=None): if self.conn_cls is None: