From 93295b9838898f3a4e1837f5690d3f2e3e88b514 Mon Sep 17 00:00:00 2001 From: linzhenxing Date: Thu, 18 Aug 2022 13:50:04 +0800 Subject: [PATCH 1/4] =?UTF-8?q?tty=20=E5=86=85=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AD=98=E6=94=BElwp=E7=9A=84=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=EF=BC=8C=E8=BF=9B=E8=A1=8C=E5=89=8D=E5=90=8E=E5=8F=B0=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/tty/console.c | 6 +++++ components/drivers/tty/include/tty.h | 10 +++++++ components/drivers/tty/n_tty.c | 5 +++- components/drivers/tty/pty.c | 8 +++++- components/drivers/tty/tty.c | 39 ++++++++++++++++++++++++++++ components/lwp/lwp.c | 13 ++++++++++ components/lwp/lwp_pid.c | 6 ++++- components/lwp/lwp_syscall.c | 10 +++++++ 8 files changed, 94 insertions(+), 3 deletions(-) diff --git a/components/drivers/tty/console.c b/components/drivers/tty/console.c index e5ca9dc153..906d782915 100644 --- a/components/drivers/tty/console.c +++ b/components/drivers/tty/console.c @@ -295,6 +295,12 @@ rt_err_t console_register(const char *name, struct rt_device *iodev) console->type = TTY_DRIVER_TYPE_CONSOLE; console->subtype = SERIAL_TYPE_NORMAL; console->driver = iodev; + console->head = rt_calloc(1, sizeof(struct list_node)); + if (!console->head) + { + return -RT_ENOMEM; + } + tty_initstack(console->head); console->pgrp = -1; console->session = -1; diff --git a/components/drivers/tty/include/tty.h b/components/drivers/tty/include/tty.h index 681c472808..124bdbaaa6 100644 --- a/components/drivers/tty/include/tty.h +++ b/components/drivers/tty/include/tty.h @@ -23,6 +23,15 @@ #define current lwp_self() #define __DISABLED_CHAR '\0' +struct list_node +{ + struct rt_lwp *p; + struct list_node *next; +}; + +void tty_initstack(struct list_node *node); +int tty_push(struct list_node **head, struct rt_lwp *lwp); +struct rt_lwp *tty_pop(struct list_node **head); /* * When a break, frame error, or parity error happens, these codes are * stuffed into the flags buffer. @@ -144,6 +153,7 @@ struct tty_struct pid_t pgrp; pid_t session; struct rt_lwp *foreground; + struct list_node *head; struct tty_ldisc *ldisc; void *disc_data; diff --git a/components/drivers/tty/n_tty.c b/components/drivers/tty/n_tty.c index 4a2652d618..1b88349ed0 100644 --- a/components/drivers/tty/n_tty.c +++ b/components/drivers/tty/n_tty.c @@ -534,6 +534,8 @@ static void __isig(int sig, struct tty_struct *tty) { if (sig == SIGTSTP) { + struct rt_lwp *old_lwp; + rt_memcpy(&old_termios, &(tty->init_termios), sizeof(struct termios)); tty->init_termios = *new_termios; ld = tty->ldisc; @@ -545,7 +547,8 @@ static void __isig(int sig, struct tty_struct *tty) } } tty_sigaddset(&lwp->signal_mask, SIGTTOU); - tty->foreground = RT_NULL; + old_lwp = tty_pop(&tty->head); + tty->foreground = old_lwp; } else { diff --git a/components/drivers/tty/pty.c b/components/drivers/tty/pty.c index 7233c17566..2ef008a24c 100644 --- a/components/drivers/tty/pty.c +++ b/components/drivers/tty/pty.c @@ -341,7 +341,13 @@ static int ptmx_register(void) ptm_drv->type = TTY_DRIVER_TYPE_PTY; ptm_drv->subtype = PTY_TYPE_MASTER; - + ptm_drv->head = rt_calloc(1, sizeof(struct list_node)); + if (!ptm_drv->head) + { + return -RT_ENOMEM; + } + tty_initstack(ptm_drv->head); + ptm_drv->pgrp = -1; ptm_drv->session = -1; ptm_drv->foreground = RT_NULL; diff --git a/components/drivers/tty/tty.c b/components/drivers/tty/tty.c index cf718b4770..9c2df2c60a 100644 --- a/components/drivers/tty/tty.c +++ b/components/drivers/tty/tty.c @@ -38,6 +38,45 @@ struct termios tty_std_termios = { /* for the benefit of tty drivers */ .__c_ospeed = 38400 }; +void tty_initstack(struct list_node *node) +{ + node->p = NULL; + node->next = node; +} + +int tty_push(struct list_node **head, struct rt_lwp *lwp) +{ + struct list_node *s = rt_calloc(1, sizeof(struct list_node)); + if (!s) + { + return -1; + } + s->p = lwp; + s->next = *head; + *head = s; + + return 0; +} + +struct rt_lwp *tty_pop(struct list_node **head) +{ + struct list_node *s; + struct rt_lwp *lwp; + + if (!*head) + { + return RT_NULL; + } + + lwp = (*head)->p; + s = *head; + *head = (*head)->next; + s->p = NULL; + rt_free(s); + + return lwp; +} + rt_inline int tty_sigismember(lwp_sigset_t *set, int _sig) { unsigned long sig = _sig - 1; diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index a14782d110..e745cf435e 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1097,6 +1097,7 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) int bg = 0; struct process_aux *aux; int tid = 0; + int ret; if (filename == RT_NULL) { @@ -1201,7 +1202,14 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) if (lwp->session == -1) { struct tty_struct *tty = RT_NULL; + struct rt_lwp *old_lwp; tty = (struct tty_struct *)console_tty_get(); + old_lwp = tty->foreground; + ret = tty_push(&tty->head, old_lwp); + if (ret < 0) + { + rt_kprintf("malloc fail!\n"); + } lwp->tty = tty; lwp->tty->pgrp = lwp->__pgrp; lwp->tty->session = lwp->session; @@ -1215,6 +1223,11 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) { if (self_lwp != RT_NULL) { + ret = tty_push(&self_lwp->tty->head, self_lwp); + if (ret < 0) + { + rt_kprintf("malloc fail!\n"); + } lwp->tty = self_lwp->tty; lwp->tty->pgrp = lwp->__pgrp; lwp->tty->session = lwp->session; diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 4f212035cc..a5477b4968 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -438,6 +438,8 @@ void lwp_free(struct rt_lwp* lwp) { struct termios *old_stdin_termios = get_old_termios(); struct rt_lwp *self_lwp = (struct rt_lwp *)lwp_self(); + struct rt_lwp *old_lwp = NULL; + if (lwp->session == -1) { tcsetattr(1, 0, old_stdin_termios); @@ -445,9 +447,11 @@ void lwp_free(struct rt_lwp* lwp) level = rt_hw_interrupt_disable(); if (lwp->tty != RT_NULL) { + old_lwp = tty_pop(&lwp->tty->head); + if (lwp->tty->foreground == lwp) { - lwp->tty->foreground = self_lwp; + lwp->tty->foreground = old_lwp; lwp->tty = RT_NULL; } } diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index f0ade6e421..b34690cd33 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -1725,6 +1725,16 @@ int _sys_fork(void) level = rt_hw_interrupt_disable(); if (lwp->tty != RT_NULL) { + int ret; + struct rt_lwp *old_lwp; + + old_lwp = lwp->tty->foreground; + ret = tty_push(&lwp->tty->head, old_lwp); + if (ret < 0) + { + rt_kprintf("malloc fail!\n"); + goto fail; + } lwp->tty->foreground = lwp; } rt_hw_interrupt_enable(level); -- Gitee From 9e8badabbe4578eec45b892f1454455a4d3549e0 Mon Sep 17 00:00:00 2001 From: linzhenxing Date: Thu, 18 Aug 2022 17:19:51 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/tty/console.c | 3 +- components/drivers/tty/include/tty.h | 14 ++--- components/drivers/tty/n_tty.c | 2 +- components/drivers/tty/pty.c | 5 +- components/drivers/tty/tty.c | 82 ++++++++++++++++++++++------ components/lwp/lwp.c | 13 ++++- components/lwp/lwp_pid.c | 15 +++-- components/lwp/lwp_pid.h | 4 +- components/lwp/lwp_syscall.c | 2 + 9 files changed, 104 insertions(+), 36 deletions(-) diff --git a/components/drivers/tty/console.c b/components/drivers/tty/console.c index 906d782915..e9c8bc6793 100644 --- a/components/drivers/tty/console.c +++ b/components/drivers/tty/console.c @@ -295,13 +295,14 @@ rt_err_t console_register(const char *name, struct rt_device *iodev) console->type = TTY_DRIVER_TYPE_CONSOLE; console->subtype = SERIAL_TYPE_NORMAL; console->driver = iodev; - console->head = rt_calloc(1, sizeof(struct list_node)); + console->head = rt_calloc(1, sizeof(struct tty_node)); if (!console->head) { return -RT_ENOMEM; } tty_initstack(console->head); + rt_mutex_init(&console->mutex, "console", RT_IPC_FLAG_PRIO); console->pgrp = -1; console->session = -1; console->foreground = RT_NULL; diff --git a/components/drivers/tty/include/tty.h b/components/drivers/tty/include/tty.h index 124bdbaaa6..97fe59baa0 100644 --- a/components/drivers/tty/include/tty.h +++ b/components/drivers/tty/include/tty.h @@ -23,15 +23,15 @@ #define current lwp_self() #define __DISABLED_CHAR '\0' -struct list_node +struct tty_node { - struct rt_lwp *p; - struct list_node *next; + struct rt_lwp *lwp; + struct tty_node *next; }; -void tty_initstack(struct list_node *node); -int tty_push(struct list_node **head, struct rt_lwp *lwp); -struct rt_lwp *tty_pop(struct list_node **head); +void tty_initstack(struct tty_node *node); +int tty_push(struct tty_node **head, struct rt_lwp *lwp); +struct rt_lwp *tty_pop(struct tty_node **head, struct rt_lwp *target_lwp); /* * When a break, frame error, or parity error happens, these codes are * stuffed into the flags buffer. @@ -153,7 +153,7 @@ struct tty_struct pid_t pgrp; pid_t session; struct rt_lwp *foreground; - struct list_node *head; + struct tty_node *head; struct tty_ldisc *ldisc; void *disc_data; diff --git a/components/drivers/tty/n_tty.c b/components/drivers/tty/n_tty.c index 1b88349ed0..5fe2e83761 100644 --- a/components/drivers/tty/n_tty.c +++ b/components/drivers/tty/n_tty.c @@ -547,7 +547,7 @@ static void __isig(int sig, struct tty_struct *tty) } } tty_sigaddset(&lwp->signal_mask, SIGTTOU); - old_lwp = tty_pop(&tty->head); + old_lwp = tty_pop(&tty->head, RT_NULL); tty->foreground = old_lwp; } else diff --git a/components/drivers/tty/pty.c b/components/drivers/tty/pty.c index 2ef008a24c..a35d29f9e6 100644 --- a/components/drivers/tty/pty.c +++ b/components/drivers/tty/pty.c @@ -341,13 +341,14 @@ static int ptmx_register(void) ptm_drv->type = TTY_DRIVER_TYPE_PTY; ptm_drv->subtype = PTY_TYPE_MASTER; - ptm_drv->head = rt_calloc(1, sizeof(struct list_node)); + ptm_drv->head = rt_calloc(1, sizeof(struct tty_node)); if (!ptm_drv->head) { return -RT_ENOMEM; } tty_initstack(ptm_drv->head); - + + rt_mutex_init(&ptm_drv->mutex, "pty", RT_IPC_FLAG_PRIO); ptm_drv->pgrp = -1; ptm_drv->session = -1; ptm_drv->foreground = RT_NULL; diff --git a/components/drivers/tty/tty.c b/components/drivers/tty/tty.c index 9c2df2c60a..94d560d5ad 100644 --- a/components/drivers/tty/tty.c +++ b/components/drivers/tty/tty.c @@ -38,41 +38,89 @@ struct termios tty_std_termios = { /* for the benefit of tty drivers */ .__c_ospeed = 38400 }; -void tty_initstack(struct list_node *node) +void tty_initstack(struct tty_node *node) { - node->p = NULL; + node->lwp = RT_NULL; node->next = node; } -int tty_push(struct list_node **head, struct rt_lwp *lwp) +static struct tty_node tty_node_cache = { RT_NULL, RT_NULL }; + +static struct tty_node *_tty_node_alloc(void) +{ + struct tty_node *node = tty_node_cache.next; + + if (node == RT_NULL) + { + node = rt_calloc(1, sizeof(struct tty_node)); + } + else + { + tty_node_cache.next = node->next; + } + + return node; +} + +static void _tty_node_free(struct tty_node *node) +{ + node->next = tty_node_cache.next; + tty_node_cache.next = node; +} + +int tty_push(struct tty_node **head, struct rt_lwp *lwp) { - struct list_node *s = rt_calloc(1, sizeof(struct list_node)); - if (!s) + struct tty_node *node = _tty_node_alloc(); + + if (!node) { return -1; } - s->p = lwp; - s->next = *head; - *head = s; + + node->lwp = lwp; + node->next = *head; + *head = node; return 0; } -struct rt_lwp *tty_pop(struct list_node **head) +struct rt_lwp *tty_pop(struct tty_node **head, struct rt_lwp *target_lwp) { - struct list_node *s; - struct rt_lwp *lwp; + struct tty_node *node; + struct rt_lwp *lwp = RT_NULL; - if (!*head) + if (!head || !*head) { return RT_NULL; } - lwp = (*head)->p; - s = *head; - *head = (*head)->next; - s->p = NULL; - rt_free(s); + node = *head; + + if (target_lwp != RT_NULL && node->lwp != target_lwp) + { + struct tty_node *prev = RT_NULL; + + while (node != RT_NULL && node->lwp != target_lwp) + { + prev = node; + node = node->next; + } + + if (node != RT_NULL) + { + /* prev is impossible equ RT_NULL */ + prev->next = node->next; + lwp = target_lwp; + _tty_node_free(node); + } + } + else + { + lwp = (*head)->lwp; + *head = (*head)->next; + node->lwp = RT_NULL; + _tty_node_free(node); + } return lwp; } diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index e745cf435e..5bec7a100f 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1008,6 +1008,7 @@ void lwp_cleanup(struct rt_thread *tid) { rt_base_t level; struct rt_lwp *lwp; + struct tty_node *tty_head; if (tid == NULL) { @@ -1022,8 +1023,12 @@ void lwp_cleanup(struct rt_thread *tid) lwp_tid_put(tid->tid); rt_list_remove(&tid->sibling); rt_hw_interrupt_enable(level); - lwp_ref_dec(lwp); - + tty_head = lwp->tty->head; + if (!lwp_ref_dec(lwp)) + { + tty_pop(&tty_head, lwp); + } + return; } @@ -1205,11 +1210,13 @@ 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->mutex, RT_WAITING_FOREVER); ret = tty_push(&tty->head, old_lwp); if (ret < 0) { rt_kprintf("malloc fail!\n"); } + rt_mutex_release(&tty->mutex); lwp->tty = tty; lwp->tty->pgrp = lwp->__pgrp; lwp->tty->session = lwp->session; @@ -1223,11 +1230,13 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) { if (self_lwp != RT_NULL) { + rt_mutex_take(&self_lwp->tty->mutex, RT_WAITING_FOREVER); ret = tty_push(&self_lwp->tty->head, self_lwp); if (ret < 0) { rt_kprintf("malloc fail!\n"); } + rt_mutex_release(&self_lwp->tty->mutex); lwp->tty = self_lwp->tty; lwp->tty->pgrp = lwp->__pgrp; lwp->tty->session = lwp->session; diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index a5477b4968..f521a02679 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -447,8 +447,9 @@ void lwp_free(struct rt_lwp* lwp) level = rt_hw_interrupt_disable(); if (lwp->tty != RT_NULL) { - old_lwp = tty_pop(&lwp->tty->head); - + rt_mutex_take(&lwp->tty->mutex, RT_WAITING_FOREVER); + old_lwp = tty_pop(&lwp->tty->head, RT_NULL); + rt_mutex_release(&lwp->tty->mutex); if (lwp->tty->foreground == lwp) { lwp->tty->foreground = old_lwp; @@ -485,16 +486,18 @@ void lwp_free(struct rt_lwp* lwp) } } -void lwp_ref_inc(struct rt_lwp *lwp) +int lwp_ref_inc(struct rt_lwp *lwp) { rt_base_t level; level = rt_hw_interrupt_disable(); lwp->ref++; rt_hw_interrupt_enable(level); + + return 0; } -void lwp_ref_dec(struct rt_lwp *lwp) +int lwp_ref_dec(struct rt_lwp *lwp) { rt_base_t level; int ref = -1; @@ -522,7 +525,11 @@ void lwp_ref_dec(struct rt_lwp *lwp) #endif /* RT_LWP_USING_SHM */ #endif /* not defined ARCH_MM_MMU */ lwp_free(lwp); + + return 0; } + + return -1; } struct rt_lwp* lwp_from_pid(pid_t pid) diff --git a/components/lwp/lwp_pid.h b/components/lwp/lwp_pid.h index d20254693d..901c6f80b8 100644 --- a/components/lwp/lwp_pid.h +++ b/components/lwp/lwp_pid.h @@ -22,8 +22,8 @@ struct lwp_avl_struct *lwp_get_pid_ary(void); struct rt_lwp* lwp_new(void); void lwp_free(struct rt_lwp* lwp); -void lwp_ref_inc(struct rt_lwp *lwp); -void lwp_ref_dec(struct rt_lwp *lwp); +int lwp_ref_inc(struct rt_lwp *lwp); +int lwp_ref_dec(struct rt_lwp *lwp); struct rt_lwp* lwp_from_pid(pid_t pid); pid_t lwp_to_pid(struct rt_lwp* lwp); diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index b34690cd33..c02a63e7f1 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -1729,12 +1729,14 @@ int _sys_fork(void) struct rt_lwp *old_lwp; old_lwp = lwp->tty->foreground; + rt_mutex_take(&lwp->tty->mutex, RT_WAITING_FOREVER); ret = tty_push(&lwp->tty->head, old_lwp); if (ret < 0) { rt_kprintf("malloc fail!\n"); goto fail; } + rt_mutex_release(&lwp->tty->mutex); lwp->tty->foreground = lwp; } rt_hw_interrupt_enable(level); -- Gitee From deb998be65d73f85da292241068b6b30cbc06058 Mon Sep 17 00:00:00 2001 From: linzhenxing Date: Fri, 19 Aug 2022 10:36:47 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E8=BF=9B=E7=A8=8B=E7=9A=84bug=E3=80=82?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E4=BD=BF=E7=94=A8log=5Fe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp.c | 28 +++++++++++++++++++++------- components/lwp/lwp_syscall.c | 5 +++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index 5bec7a100f..ab2186b6d1 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1008,7 +1008,7 @@ void lwp_cleanup(struct rt_thread *tid) { rt_base_t level; struct rt_lwp *lwp; - struct tty_node *tty_head; + struct tty_node *tty_head = RT_NULL; if (tid == NULL) { @@ -1023,10 +1023,16 @@ void lwp_cleanup(struct rt_thread *tid) lwp_tid_put(tid->tid); rt_list_remove(&tid->sibling); rt_hw_interrupt_enable(level); - tty_head = lwp->tty->head; + if (lwp->tty != RT_NULL) + { + tty_head = lwp->tty->head; + } if (!lwp_ref_dec(lwp)) { - tty_pop(&tty_head, lwp); + if (tty_head) + { + tty_pop(&tty_head, lwp); + } } return; @@ -1212,11 +1218,15 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) old_lwp = tty->foreground; rt_mutex_take(&tty->mutex, RT_WAITING_FOREVER); ret = tty_push(&tty->head, old_lwp); + rt_mutex_release(&tty->mutex); if (ret < 0) { - rt_kprintf("malloc fail!\n"); + lwp_tid_put(tid); + lwp_ref_dec(lwp); + LOG_E("malloc fail!\n"); + return -ENOMEM; } - rt_mutex_release(&tty->mutex); + lwp->tty = tty; lwp->tty->pgrp = lwp->__pgrp; lwp->tty->session = lwp->session; @@ -1232,11 +1242,15 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) { rt_mutex_take(&self_lwp->tty->mutex, RT_WAITING_FOREVER); ret = tty_push(&self_lwp->tty->head, self_lwp); + rt_mutex_release(&self_lwp->tty->mutex); if (ret < 0) { - rt_kprintf("malloc fail!\n"); + lwp_tid_put(tid); + lwp_ref_dec(lwp); + LOG_E("malloc fail!\n"); + return -ENOMEM; } - rt_mutex_release(&self_lwp->tty->mutex); + lwp->tty = self_lwp->tty; lwp->tty->pgrp = lwp->__pgrp; lwp->tty->session = lwp->session; diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index c02a63e7f1..96c599a8b9 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -1731,12 +1731,13 @@ int _sys_fork(void) old_lwp = lwp->tty->foreground; rt_mutex_take(&lwp->tty->mutex, RT_WAITING_FOREVER); ret = tty_push(&lwp->tty->head, old_lwp); + rt_mutex_release(&lwp->tty->mutex); if (ret < 0) { - rt_kprintf("malloc fail!\n"); + LOG_E("malloc fail!\n"); goto fail; } - rt_mutex_release(&lwp->tty->mutex); + lwp->tty->foreground = lwp; } rt_hw_interrupt_enable(level); -- Gitee From 9e1470ad83555dfca23ca62206db9e5ef1393c90 Mon Sep 17 00:00:00 2001 From: linzhenxing Date: Fri, 19 Aug 2022 11:03:33 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=B0=86mutex=E6=94=B9=E6=88=90spinlock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/tty/console.c | 2 +- components/drivers/tty/include/tty.h | 7 +++++-- components/drivers/tty/pty.c | 2 +- components/lwp/lwp.c | 8 ++++---- components/lwp/lwp_pid.c | 4 ++-- components/lwp/lwp_syscall.c | 4 ++-- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/components/drivers/tty/console.c b/components/drivers/tty/console.c index e9c8bc6793..dc8e8257dd 100644 --- a/components/drivers/tty/console.c +++ b/components/drivers/tty/console.c @@ -302,7 +302,7 @@ rt_err_t console_register(const char *name, struct rt_device *iodev) } tty_initstack(console->head); - rt_mutex_init(&console->mutex, "console", RT_IPC_FLAG_PRIO); + rt_spin_lock_init(&console->spinlock); console->pgrp = -1; console->session = -1; console->foreground = RT_NULL; diff --git a/components/drivers/tty/include/tty.h b/components/drivers/tty/include/tty.h index 97fe59baa0..ff2e88ee5f 100644 --- a/components/drivers/tty/include/tty.h +++ b/components/drivers/tty/include/tty.h @@ -148,8 +148,11 @@ struct tty_struct struct winsize winsize; struct termios init_termios; - struct rt_mutex mutex; - +#ifdef RT_USING_SMP + struct rt_spinlock spinlock; +#else + rt_spinlock_t spinlock; +#endif pid_t pgrp; pid_t session; struct rt_lwp *foreground; diff --git a/components/drivers/tty/pty.c b/components/drivers/tty/pty.c index a35d29f9e6..40b2c0f552 100644 --- a/components/drivers/tty/pty.c +++ b/components/drivers/tty/pty.c @@ -348,7 +348,7 @@ static int ptmx_register(void) } tty_initstack(ptm_drv->head); - rt_mutex_init(&ptm_drv->mutex, "pty", RT_IPC_FLAG_PRIO); + rt_spin_lock_init(&ptm_drv->spinlock); ptm_drv->pgrp = -1; ptm_drv->session = -1; ptm_drv->foreground = RT_NULL; diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index ab2186b6d1..99d5f5bed3 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1216,9 +1216,9 @@ 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->mutex, RT_WAITING_FOREVER); + rt_spin_lock(&tty->spinlock); ret = tty_push(&tty->head, old_lwp); - rt_mutex_release(&tty->mutex); + rt_spin_unlock(&tty->spinlock); if (ret < 0) { lwp_tid_put(tid); @@ -1240,9 +1240,9 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) { if (self_lwp != RT_NULL) { - rt_mutex_take(&self_lwp->tty->mutex, RT_WAITING_FOREVER); + rt_spin_lock(&self_lwp->tty->spinlock); ret = tty_push(&self_lwp->tty->head, self_lwp); - rt_mutex_release(&self_lwp->tty->mutex); + rt_spin_unlock(&self_lwp->tty->spinlock); if (ret < 0) { lwp_tid_put(tid); diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index f521a02679..2e18a57f39 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -447,9 +447,9 @@ void lwp_free(struct rt_lwp* lwp) level = rt_hw_interrupt_disable(); if (lwp->tty != RT_NULL) { - rt_mutex_take(&lwp->tty->mutex, RT_WAITING_FOREVER); + rt_spin_lock(&lwp->tty->spinlock); old_lwp = tty_pop(&lwp->tty->head, RT_NULL); - rt_mutex_release(&lwp->tty->mutex); + rt_spin_unlock(&lwp->tty->spinlock); if (lwp->tty->foreground == lwp) { lwp->tty->foreground = old_lwp; diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 96c599a8b9..9d2ce4e35a 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -1729,9 +1729,9 @@ int _sys_fork(void) struct rt_lwp *old_lwp; old_lwp = lwp->tty->foreground; - rt_mutex_take(&lwp->tty->mutex, RT_WAITING_FOREVER); + rt_spin_lock(&lwp->tty->spinlock); ret = tty_push(&lwp->tty->head, old_lwp); - rt_mutex_release(&lwp->tty->mutex); + rt_spin_unlock(&lwp->tty->spinlock); if (ret < 0) { LOG_E("malloc fail!\n"); -- Gitee