From b66514686a8745ee36a4384dec044d3ae31d7dcb Mon Sep 17 00:00:00 2001 From: Shell Date: Wed, 28 Jun 2023 09:11:17 +0800 Subject: [PATCH] [components/tty] fix bug on foreground app switch (#7726) --- components/drivers/tty/include/tty.h | 4 ++-- components/drivers/tty/tty.c | 5 +++-- components/lwp/lwp.c | 21 +++++++++++++-------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/components/drivers/tty/include/tty.h b/components/drivers/tty/include/tty.h index 298b033373..1c0fa09ca3 100644 --- a/components/drivers/tty/include/tty.h +++ b/components/drivers/tty/include/tty.h @@ -179,8 +179,8 @@ enum #define TTY_DRIVER_TYPE_SYSTEM 0x0001 #define TTY_DRIVER_TYPE_CONSOLE 0x0002 #define TTY_DRIVER_TYPE_SERIAL 0x0003 -#define TTY_DRIVER_TYPE_PTY 0x0004 -#define TTY_DRIVER_TYPE_SCC 0x0005 /* scc driver */ +#define TTY_DRIVER_TYPE_PTY 0x0004 +#define TTY_DRIVER_TYPE_SCC 0x0005 /* scc driver */ #define TTY_DRIVER_TYPE_SYSCONS 0x0006 /* tty magic number */ diff --git a/components/drivers/tty/tty.c b/components/drivers/tty/tty.c index 10683b5f9d..748be743cb 100644 --- a/components/drivers/tty/tty.c +++ b/components/drivers/tty/tty.c @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2021.12.07 linzhenxing first version + * 2021-12-07 linzhenxing first version + * 2023-06-26 WangXiaoyao fix bug on foreground app switch */ #include #include @@ -41,7 +42,7 @@ const struct termios tty_std_termios = { /* for the benefit of tty drivers */ void tty_initstack(struct tty_node *node) { node->lwp = RT_NULL; - node->next = node; + node->next = RT_NULL; } static struct tty_node tty_node_cache = { RT_NULL, RT_NULL }; diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index a341c1b977..a9e34f0921 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -10,6 +10,7 @@ * 2021-02-03 lizhirui add 64-bit arch support and riscv64 arch support * 2021-08-26 linzhenxing add lwp_setcwd\lwp_getcwd * 2023-02-20 wangxiaoyao inv icache before new app startup + * 2023-02-20 wangxiaoyao fix bug on foreground app switch */ #include @@ -1250,15 +1251,19 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) struct rt_lwp *old_lwp; tty = (struct tty_struct *)console_tty_get(); old_lwp = tty->foreground; - rt_mutex_take(&tty->lock, RT_WAITING_FOREVER); - ret = tty_push(&tty->head, old_lwp); - rt_mutex_release(&tty->lock); - if (ret < 0) + if (old_lwp) { - lwp_tid_put(tid); - lwp_ref_dec(lwp); - LOG_E("malloc fail!\n"); - return -ENOMEM; + rt_mutex_take(&tty->lock, RT_WAITING_FOREVER); + ret = tty_push(&tty->head, old_lwp); + rt_mutex_release(&tty->lock); + + if (ret < 0) + { + lwp_tid_put(tid); + lwp_ref_dec(lwp); + LOG_E("malloc fail!\n"); + return -ENOMEM; + } } lwp->tty = tty;