From a300cef2a82281904a61c3b956e92059c206a416 Mon Sep 17 00:00:00 2001 From: Shell Date: Mon, 25 Sep 2023 16:12:49 +0800 Subject: [PATCH] [smart] split out part of lwp_new() to lwp_create() Prev implementation of lwp_new() including the create of lwp object and the pid allocation. But not every lwp object need a pid. So this patch split out the business of lwp_new() to improve the maintainability. Signed-off-by: Shell --- components/lwp/lwp.c | 2 +- components/lwp/lwp.h | 1 + components/lwp/lwp_pid.c | 75 ++++++++++----------- components/lwp/lwp_pid.h | 7 +- components/lwp/lwp_syscall.c | 12 +--- examples/utest/testcases/mm/mm_lwp_tc.c | 6 +- examples/utest/testcases/mm/test_bst_adpt.h | 2 +- 7 files changed, 49 insertions(+), 56 deletions(-) diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index 858662fb99..199c61c116 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1152,7 +1152,7 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) return -EACCES; } - lwp = lwp_new(); + lwp = lwp_create(LWP_CREATE_FLAG_ALLOC_PID); if (lwp == RT_NULL) { diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 3c003a2039..445a6ad32a 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -145,6 +145,7 @@ struct rt_lwp unsigned int asid; #endif }; +typedef struct rt_lwp *rt_lwp_t; struct rt_lwp *lwp_self(void); diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 9b5ecf46e5..a52265debd 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -314,53 +314,46 @@ void lwp_user_object_dup(struct rt_lwp *dst_lwp, struct rt_lwp *src_lwp) lwp_user_object_unlock(src_lwp); } -struct rt_lwp* lwp_new(void) +rt_lwp_t lwp_create(rt_base_t flags) { pid_t pid; rt_base_t level; - struct rt_lwp* lwp = RT_NULL; + rt_lwp_t new_lwp = rt_calloc(1, sizeof(struct rt_lwp)); - lwp = (struct rt_lwp *)rt_malloc(sizeof(struct rt_lwp)); - if (lwp == RT_NULL) + if (new_lwp) { - return lwp; + /* minimal setup of lwp object */ + new_lwp->session = -1; + new_lwp->ref = 1; + rt_list_init(&new_lwp->wait_list); + rt_list_init(&new_lwp->t_grp); + rt_list_init(&new_lwp->timer); + lwp_user_object_lock_init(new_lwp); + rt_wqueue_init(&new_lwp->wait_queue); + lwp_signal_init(&new_lwp->signal); + + /* lwp with pid */ + if (flags & LWP_CREATE_FLAG_ALLOC_PID) + { + level = rt_hw_interrupt_disable(); + pid = lwp_pid_get(); + if (pid == 0) + { + lwp_user_object_lock_destroy(new_lwp); + rt_free(new_lwp); + new_lwp = RT_NULL; + LOG_E("pid slot fulled!\n"); + } + else + { + new_lwp->pid = pid; + lwp_pid_set_lwp(pid, new_lwp); + } + + rt_hw_interrupt_enable(level); + } } - memset(lwp, 0, sizeof(*lwp)); - //lwp->tgroup_leader = RT_NULL; - rt_list_init(&lwp->wait_list); - lwp->leader = 0; - lwp->session = -1; - lwp->tty = RT_NULL; - rt_list_init(&lwp->t_grp); - rt_list_init(&lwp->timer); - lwp_user_object_lock_init(lwp); - lwp->address_search_head = RT_NULL; - rt_wqueue_init(&lwp->wait_queue); - lwp->ref = 1; - - lwp_signal_init(&lwp->signal); - - level = rt_hw_interrupt_disable(); - pid = lwp_pid_get(); - if (pid == 0) - { - lwp_user_object_lock_destroy(lwp); - rt_free(lwp); - lwp = RT_NULL; - LOG_E("pid slot fulled!\n"); - goto out; - } - lwp->pid = pid; - lwp_pid_set_lwp(pid, lwp); - -#ifdef LWP_ENABLE_ASID - lwp->generation = 0; - lwp->asid = 0; -#endif - -out: - rt_hw_interrupt_enable(level); - return lwp; + return new_lwp; } void lwp_free(struct rt_lwp* lwp) diff --git a/components/lwp/lwp_pid.h b/components/lwp/lwp_pid.h index 06855c9188..11177af122 100644 --- a/components/lwp/lwp_pid.h +++ b/components/lwp/lwp_pid.h @@ -17,11 +17,16 @@ extern "C" { #endif +#define LWP_CREATE_FLAG_NONE 0x0000 +#define LWP_CREATE_FLAG_ALLOC_PID 0x0001 /* allocate pid on lwp object create */ + struct rt_lwp; struct lwp_avl_struct *lwp_get_pid_ary(void); -struct rt_lwp* lwp_new(void); +/* create a lwp object */ +struct rt_lwp* lwp_create(rt_base_t flags); + void lwp_free(struct rt_lwp* lwp); int lwp_ref_inc(struct rt_lwp *lwp); diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 11ecdb7e48..043af53f3c 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -2083,7 +2083,7 @@ sysret_t _sys_fork(void) void *user_stack = RT_NULL; /* new lwp */ - lwp = lwp_new(); + lwp = lwp_create(LWP_CREATE_FLAG_ALLOC_PID); if (!lwp) { SET_ERRNO(ENOMEM); @@ -2685,15 +2685,13 @@ sysret_t sys_execve(const char *path, char *const argv[], char *const envp[]) } /* alloc new lwp to operation */ - new_lwp = (struct rt_lwp *)rt_malloc(sizeof(struct rt_lwp)); + new_lwp = lwp_create(LWP_CREATE_FLAG_NONE); if (!new_lwp) { SET_ERRNO(ENOMEM); goto quit; } - rt_memset(new_lwp, 0, sizeof(struct rt_lwp)); - new_lwp->ref = 1; - lwp_user_object_lock_init(new_lwp); + ret = lwp_user_space_init(new_lwp, 0); if (ret != 0) { @@ -2788,10 +2786,6 @@ sysret_t sys_execve(const char *path, char *const argv[], char *const envp[]) rt_hw_interrupt_enable(level); - /* setup the signal, timer_list for the dummy lwp, so that is can be smoothly recycled */ - lwp_signal_init(&new_lwp->signal); - rt_list_init(&new_lwp->timer); - lwp_ref_dec(new_lwp); arch_start_umode(lwp->args, lwp->text_entry, diff --git a/examples/utest/testcases/mm/mm_lwp_tc.c b/examples/utest/testcases/mm/mm_lwp_tc.c index f3732624a1..b0e82085bf 100644 --- a/examples/utest/testcases/mm/mm_lwp_tc.c +++ b/examples/utest/testcases/mm/mm_lwp_tc.c @@ -50,7 +50,7 @@ static void test_user_map_varea(void) const size_t buf_sz = ARCH_PAGE_SIZE * 4; struct rt_lwp *lwp; rt_varea_t varea; - lwp = lwp_new(); + lwp = lwp_create(LWP_CREATE_FLAG_NONE); /* prepare environment */ uassert_true(!!lwp); @@ -74,7 +74,7 @@ static void test_user_map_varea_ext(void) const size_t buf_sz = ARCH_PAGE_SIZE * 4; struct rt_lwp *lwp; rt_varea_t varea; - lwp = lwp_new(); + lwp = lwp_create(LWP_CREATE_FLAG_NONE); uassert_true(!!lwp); uassert_true(!lwp_user_space_init(lwp, 1)); @@ -104,7 +104,7 @@ static void test_user_accessible(void) /* Prepare Environment */ char *test_address = (char *)(USER_STACK_VEND); struct rt_lwp *lwp; - lwp = lwp_new(); + lwp = lwp_create(LWP_CREATE_FLAG_NONE); uassert_true(!!lwp); uassert_true(!lwp_user_space_init(lwp, 0)); diff --git a/examples/utest/testcases/mm/test_bst_adpt.h b/examples/utest/testcases/mm/test_bst_adpt.h index ffd153f08a..1a1b55de43 100644 --- a/examples/utest/testcases/mm/test_bst_adpt.h +++ b/examples/utest/testcases/mm/test_bst_adpt.h @@ -31,7 +31,7 @@ void test_bst_adpt(void) rt_mem_obj_t mem_obj; /* create aspace by lwp */ - lwp = lwp_new(); + lwp = lwp_create(LWP_CREATE_FLAG_NONE); uassert_true(!!lwp); uassert_true(!lwp_user_space_init(lwp, 0)); aspace = lwp->aspace;