summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShell <[email protected]>2023-09-25 16:12:49 +0800
committerguo <[email protected]>2023-10-11 08:48:06 +0800
commita300cef2a82281904a61c3b956e92059c206a416 (patch)
tree2075e100d0e87f763f12036196c5dd80eef16e51
parent261f5bee6794431fb04c07c6be0779a135782466 (diff)
[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 <[email protected]>
-rw-r--r--components/lwp/lwp.c2
-rw-r--r--components/lwp/lwp.h1
-rw-r--r--components/lwp/lwp_pid.c71
-rw-r--r--components/lwp/lwp_pid.h7
-rw-r--r--components/lwp/lwp_syscall.c12
-rw-r--r--examples/utest/testcases/mm/mm_lwp_tc.c6
-rw-r--r--examples/utest/testcases/mm/test_bst_adpt.h2
7 files changed, 47 insertions, 54 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;
- }
- 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;
+ /* 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_signal_init(&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);
+ }
- 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;
+ rt_hw_interrupt_enable(level);
+ }
}
- 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;