Merge pull request #143 from valschneider/invoke_bg
Add option to run target.invoke() in the background
diff --git a/devlib/target.py b/devlib/target.py
index f3aaea0..65d5600 100644
--- a/devlib/target.py
+++ b/devlib/target.py
@@ -351,6 +351,38 @@
command = 'cd {} && {}'.format(in_directory, command)
return self.execute(command, as_root=as_root, timeout=timeout)
+ def background_invoke(self, binary, args=None, in_directory=None,
+ on_cpus=None, as_root=False):
+ """
+ Executes the specified binary as a background task under the
+ specified conditions.
+
+ :binary: binary to execute. Must be present and executable on the device.
+ :args: arguments to be passed to the binary. The can be either a list or
+ a string.
+ :in_directory: execute the binary in the specified directory. This must
+ be an absolute path.
+ :on_cpus: taskset the binary to these CPUs. This may be a single ``int`` (in which
+ case, it will be interpreted as the mask), a list of ``ints``, in which
+ case this will be interpreted as the list of cpus, or string, which
+ will be interpreted as a comma-separated list of cpu ranges, e.g.
+ ``"0,4-7"``.
+ :as_root: Specify whether the command should be run as root
+
+ :returns: the subprocess instance handling that command
+ """
+ command = binary
+ if args:
+ if isiterable(args):
+ args = ' '.join(args)
+ command = '{} {}'.format(command, args)
+ if on_cpus:
+ on_cpus = bitmask(on_cpus)
+ command = '{} taskset 0x{:x} {}'.format(self.busybox, on_cpus, command)
+ if in_directory:
+ command = 'cd {} && {}'.format(in_directory, command)
+ return self.background(command, as_root=as_root)
+
def kick_off(self, command, as_root=False):
raise NotImplementedError()
diff --git a/doc/target.rst b/doc/target.rst
index d14942e..5339a72 100644
--- a/doc/target.rst
+++ b/doc/target.rst
@@ -265,6 +265,24 @@
:param timeout: If this is specified and invocation does not terminate within this number
of seconds, an exception will be raised.
+.. method:: Target.background_invoke(binary [, args [, in_directory [, on_cpus [, as_root ]]]])
+
+ Execute the specified binary on target (must already be installed) as a background
+ task, under the specified conditions and return the :class:`subprocess.Popen`
+ instance for the command.
+
+ :param binary: binary to execute. Must be present and executable on the device.
+ :param args: arguments to be passed to the binary. The can be either a list or
+ a string.
+ :param in_directory: execute the binary in the specified directory. This must
+ be an absolute path.
+ :param on_cpus: taskset the binary to these CPUs. This may be a single ``int`` (in which
+ case, it will be interpreted as the mask), a list of ``ints``, in which
+ case this will be interpreted as the list of cpus, or string, which
+ will be interpreted as a comma-separated list of cpu ranges, e.g.
+ ``"0,4-7"``.
+ :param as_root: Specify whether the command should be run as root
+
.. method:: Target.kick_off(command [, as_root])
Kick off the specified command on the target and return immediately. Unlike