[U-Boot] [PATCH] test/py: handle exceptions in console creation
Simon Glass
sjg at chromium.org
Mon Feb 15 02:19:54 CET 2016
Hi Stephen,
On 10 February 2016 at 16:54, Stephen Warren <swarren at wwwdotorg.org> wrote:
> From: Stephen Warren <swarren at nvidia.com>
>
> u_boot_console.exec_attach.get_spawn() performs two steps:
> 1) Spawn a process to communicate with the serial console.
> 2) Reset the board so that U-Boot starts running from scratch.
>
> Currently, if an exception happens in step (2), no cleanup is performed on
> the process created in step (1). That process stays running and may e.g.
> hold serial port locks, or simply continue to read data from the serial
> port, thus preventing it from reaching any other process that attempts to
> read from the same serial port later. While there is error cleanup code in
> u_boot_console_base.ensure_spawned(), this is not triggered since the
> exception prevents assignment to self.p there, and hence the exception
> handler has no object to operate upon in cleanup_spawn().
>
> Solve this by enhancing u_boot_console.exec_attach.get_spawn() to clean
> up any objects it has created.
>
> In theory, u_boot_spawn.Spawn's constructor has a similar issue, so fix
> this too.
>
> Signed-off-by: Stephen Warren <swarren at nvidia.com>
> ---
> test/py/u_boot_console_exec_attach.py | 14 +++++++++-----
> test/py/u_boot_spawn.py | 8 ++++++--
> 2 files changed, 15 insertions(+), 7 deletions(-)
>
Acked-by: Simon Glass <sjg at chromium.org>
But please see below.
> diff --git a/test/py/u_boot_console_exec_attach.py b/test/py/u_boot_console_exec_attach.py
> index 1be27c193079..445b58dda612 100644
> --- a/test/py/u_boot_console_exec_attach.py
> +++ b/test/py/u_boot_console_exec_attach.py
> @@ -58,10 +58,14 @@ class ConsoleExecAttach(ConsoleBase):
> args = [self.config.board_type, self.config.board_identity]
> s = Spawn(['u-boot-test-console'] + args)
>
> - self.log.action('Resetting board')
> - cmd = ['u-boot-test-reset'] + args
> - runner = self.log.get_runner(cmd[0], sys.stdout)
> - runner.run(cmd)
> - runner.close()
> + try:
> + self.log.action('Resetting board')
> + cmd = ['u-boot-test-reset'] + args
> + runner = self.log.get_runner(cmd[0], sys.stdout)
> + runner.run(cmd)
> + runner.close()
> + except:
> + s.close()
> + raise
Would try...finally work here? It might avoid the 'raise'.
>
> return s
> diff --git a/test/py/u_boot_spawn.py b/test/py/u_boot_spawn.py
> index 3d9cde5ee0d0..a5f4a8e91bae 100644
> --- a/test/py/u_boot_spawn.py
> +++ b/test/py/u_boot_spawn.py
> @@ -56,8 +56,12 @@ class Spawn(object):
> finally:
> os._exit(255)
>
> - self.poll = select.poll()
> - self.poll.register(self.fd, select.POLLIN | select.POLLPRI | select.POLLERR | select.POLLHUP | select.POLLNVAL)
> + try:
> + self.poll = select.poll()
> + self.poll.register(self.fd, select.POLLIN | select.POLLPRI | select.POLLERR | select.POLLHUP | select.POLLNVAL)
> + except:
> + self.close()
> + raise
>
> def kill(self, sig):
> """Send unix signal "sig" to the child process.
> --
> 2.7.0
>
More information about the U-Boot
mailing list