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

target: Expose Target(max_async=50) parameter

Allow the user to set a maximum number of conrruent connections used to
dispatch non-blocking commands when using the async API.
This commit is contained in:
Douglas Raillard 2022-04-08 15:20:33 +01:00 committed by Marc Bonnici
parent 92f58e4e7a
commit 18ab9f80b0
2 changed files with 39 additions and 12 deletions

View File

@ -306,9 +306,11 @@ class Target(object):
load_default_modules=True, load_default_modules=True,
shell_prompt=DEFAULT_SHELL_PROMPT, shell_prompt=DEFAULT_SHELL_PROMPT,
conn_cls=None, conn_cls=None,
is_container=False is_container=False,
max_async=50,
): ):
self._async_pool = None self._async_pool = None
self._async_pool_size = None
self._unused_conns = set() self._unused_conns = set()
self._is_rooted = None self._is_rooted = None
@ -352,7 +354,7 @@ class Target(object):
self.modules = merge_lists(*module_lists, duplicates='first') self.modules = merge_lists(*module_lists, duplicates='first')
self._update_modules('early') self._update_modules('early')
if connect: if connect:
self.connect() self.connect(max_async=max_async)
def __getstate__(self): def __getstate__(self):
# tls_property will recreate the underlying value automatically upon # tls_property will recreate the underlying value automatically upon
@ -363,12 +365,25 @@ class Target(object):
for k, v in inspect.getmembers(self.__class__) for k, v in inspect.getmembers(self.__class__)
if isinstance(v, _BoundTLSProperty) if isinstance(v, _BoundTLSProperty)
} }
ignored.update((
'_async_pool',
'_unused_conns',
))
return { return {
k: v k: v
for k, v in self.__dict__.items() for k, v in self.__dict__.items()
if k not in ignored if k not in ignored
} }
def __setstate__(self, dct):
self.__dict__ = dct
pool_size = self._async_pool_size
if pool_size is None:
self._async_pool = None
else:
self._async_pool = ThreadPoolExecutor(pool_size)
self._unused_conns = set()
# connection and initialization # connection and initialization
@asyn.asyncf @asyn.asyncf
@ -433,6 +448,7 @@ class Target(object):
max_conns = len(conns) max_conns = len(conns)
self.logger.debug(f'Detected max number of async commands: {max_conns}') self.logger.debug(f'Detected max number of async commands: {max_conns}')
self._async_pool_size = max_conns
self._async_pool = ThreadPoolExecutor(max_conns) self._async_pool = ThreadPoolExecutor(max_conns)
@asyn.asyncf @asyn.asyncf
@ -1547,6 +1563,7 @@ class LinuxTarget(Target):
shell_prompt=DEFAULT_SHELL_PROMPT, shell_prompt=DEFAULT_SHELL_PROMPT,
conn_cls=SshConnection, conn_cls=SshConnection,
is_container=False, is_container=False,
max_async=50,
): ):
super(LinuxTarget, self).__init__(connection_settings=connection_settings, super(LinuxTarget, self).__init__(connection_settings=connection_settings,
platform=platform, platform=platform,
@ -1557,7 +1574,8 @@ class LinuxTarget(Target):
load_default_modules=load_default_modules, load_default_modules=load_default_modules,
shell_prompt=shell_prompt, shell_prompt=shell_prompt,
conn_cls=conn_cls, conn_cls=conn_cls,
is_container=is_container) is_container=is_container,
max_async=max_async)
def wait_boot_complete(self, timeout=10): def wait_boot_complete(self, timeout=10):
pass pass
@ -1752,6 +1770,7 @@ class AndroidTarget(Target):
conn_cls=AdbConnection, conn_cls=AdbConnection,
package_data_directory="/data/data", package_data_directory="/data/data",
is_container=False, is_container=False,
max_async=50,
): ):
super(AndroidTarget, self).__init__(connection_settings=connection_settings, super(AndroidTarget, self).__init__(connection_settings=connection_settings,
platform=platform, platform=platform,
@ -1762,7 +1781,8 @@ class AndroidTarget(Target):
load_default_modules=load_default_modules, load_default_modules=load_default_modules,
shell_prompt=shell_prompt, shell_prompt=shell_prompt,
conn_cls=conn_cls, conn_cls=conn_cls,
is_container=is_container) is_container=is_container,
max_async=max_async)
self.package_data_directory = package_data_directory self.package_data_directory = package_data_directory
self._init_logcat_lock() self._init_logcat_lock()
@ -2823,6 +2843,7 @@ class LocalLinuxTarget(LinuxTarget):
shell_prompt=DEFAULT_SHELL_PROMPT, shell_prompt=DEFAULT_SHELL_PROMPT,
conn_cls=LocalConnection, conn_cls=LocalConnection,
is_container=False, is_container=False,
max_async=50,
): ):
super(LocalLinuxTarget, self).__init__(connection_settings=connection_settings, super(LocalLinuxTarget, self).__init__(connection_settings=connection_settings,
platform=platform, platform=platform,
@ -2833,7 +2854,8 @@ class LocalLinuxTarget(LinuxTarget):
load_default_modules=load_default_modules, load_default_modules=load_default_modules,
shell_prompt=shell_prompt, shell_prompt=shell_prompt,
conn_cls=conn_cls, conn_cls=conn_cls,
is_container=is_container) is_container=is_container,
max_async=max_async)
def _resolve_paths(self): def _resolve_paths(self):
if self.working_directory is None: if self.working_directory is None:
@ -2906,7 +2928,8 @@ class ChromeOsTarget(LinuxTarget):
load_default_modules=True, load_default_modules=True,
shell_prompt=DEFAULT_SHELL_PROMPT, shell_prompt=DEFAULT_SHELL_PROMPT,
package_data_directory="/data/data", package_data_directory="/data/data",
is_container=False is_container=False,
max_async=50,
): ):
self.supports_android = None self.supports_android = None
@ -2932,7 +2955,8 @@ class ChromeOsTarget(LinuxTarget):
load_default_modules=load_default_modules, load_default_modules=load_default_modules,
shell_prompt=shell_prompt, shell_prompt=shell_prompt,
conn_cls=SshConnection, conn_cls=SshConnection,
is_container=is_container) is_container=is_container,
max_async=max_async)
# We can't determine if the target supports android until connected to the linux host so # We can't determine if the target supports android until connected to the linux host so
# create unconditionally. # create unconditionally.

View File

@ -3,7 +3,7 @@
Target Target
====== ======
.. class:: Target(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=None) .. class:: Target(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=None, max_async=50)
:class:`~devlib.target.Target` is the primary interface to the remote :class:`~devlib.target.Target` is the primary interface to the remote
device. All interactions with the device are performed via a device. All interactions with the device are performed via a
@ -76,6 +76,9 @@ Target
:param conn_cls: This is the type of connection that will be used to :param conn_cls: This is the type of connection that will be used to
communicate with the device. communicate with the device.
:param max_async: Maximum number of opened connections to the target used to
issue non-blocking commands when using the async API.
.. attribute:: Target.core_names .. attribute:: Target.core_names
This is a list containing names of CPU cores on the target, in the order in This is a list containing names of CPU cores on the target, in the order in
@ -606,7 +609,7 @@ Target
Linux Target Linux Target
------------ ------------
.. class:: LinuxTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=SshConnection, is_container=False,) .. class:: LinuxTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=SshConnection, is_container=False, max_async=50)
:class:`LinuxTarget` is a subclass of :class:`~devlib.target.Target` :class:`LinuxTarget` is a subclass of :class:`~devlib.target.Target`
with customisations specific to a device running linux. with customisations specific to a device running linux.
@ -615,7 +618,7 @@ Linux Target
Local Linux Target Local Linux Target
------------------ ------------------
.. class:: LocalLinuxTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=SshConnection, is_container=False,) .. class:: LocalLinuxTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=SshConnection, is_container=False, max_async=50)
:class:`LocalLinuxTarget` is a subclass of :class:`LocalLinuxTarget` is a subclass of
:class:`~devlib.target.LinuxTarget` with customisations specific to using :class:`~devlib.target.LinuxTarget` with customisations specific to using
@ -625,7 +628,7 @@ Local Linux Target
Android Target Android Target
--------------- ---------------
.. class:: AndroidTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=AdbConnection, package_data_directory="/data/data") .. class:: AndroidTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=AdbConnection, package_data_directory="/data/data", max_async=50)
:class:`AndroidTarget` is a subclass of :class:`~devlib.target.Target` with :class:`AndroidTarget` is a subclass of :class:`~devlib.target.Target` with
additional features specific to a device running Android. additional features specific to a device running Android.
@ -773,7 +776,7 @@ Android Target
ChromeOS Target ChromeOS Target
--------------- ---------------
.. class:: ChromeOsTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, android_working_directory=None, android_executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, package_data_directory="/data/data") .. class:: ChromeOsTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, android_working_directory=None, android_executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, package_data_directory="/data/data", max_async=50)
:class:`ChromeOsTarget` is a subclass of :class:`LinuxTarget` with :class:`ChromeOsTarget` is a subclass of :class:`LinuxTarget` with
additional features specific to a device running ChromeOS for example, additional features specific to a device running ChromeOS for example,