diff options
| author | heyuanjie <xx> | 2018-06-29 15:32:53 +0800 |
|---|---|---|
| committer | heyuanjie <xx> | 2018-06-29 15:32:53 +0800 |
| commit | 7d3af8e9ff2f5baf8a451a52e5d953851cdde15a (patch) | |
| tree | 54c832d5664644cd72130a2448511d1e5d407555 /components/lwp/lwp.c | |
| parent | 0f3820f1b671c56143e8417d4e332b035a7da176 (diff) | |
给lwp传递参数
Diffstat (limited to 'components/lwp/lwp.c')
| -rw-r--r-- | components/lwp/lwp.c | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index 13e2a8f2ef..7157f27250 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -25,10 +25,6 @@ #include <rthw.h> #include <dfs_posix.h> -#ifdef RT_USING_FINSH - #include <finsh.h> -#endif - #ifndef RT_USING_DFS #error "lwp need file system(RT_USING_DFS)" #endif @@ -42,7 +38,7 @@ #include <rtdbg.h> extern rt_thread_t rt_current_thread; -extern void lwp_user_entry(const void *text, void *data); +extern void lwp_user_entry(void *args, const void *text, void *data); /** * RT-Thread light-weight process @@ -62,6 +58,43 @@ uint32_t *lwp_get_kernel_sp(void) return user_data->kernel_sp; } +static int lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv) +{ + int size = sizeof(int)*3; /* store argc, argv, NULL */ + int *args; + char *str; + char **new_argv; + int i; + int len; + + for (i = 0; i < argc; i ++) + { + size += (rt_strlen(argv[i]) + 1); + } + size += (sizeof(int) * argc); + + args = (int*)rt_malloc(size); + if (args == RT_NULL) + return -1; + + str = (char*)((int)args + (argc + 3) * sizeof(int)); + new_argv = (char**)&args[2]; + args[0] = argc; + args[1] = (int)new_argv; + + for (i = 0; i < argc; i ++) + { + len = rt_strlen(argv[i]) + 1; + new_argv[i] = str; + rt_memcpy(str, argv[i], len); + str += len; + } + new_argv[i] = 0; + lwp->args = args; + + return 0; +} + static int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size) { int fd; @@ -76,8 +109,6 @@ static int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr /* check lwp control block */ RT_ASSERT(lwp != RT_NULL); - memset(lwp, 0x00, sizeof(struct rt_lwp)); - if (load_addr != RT_NULL) { lwp->lwp_type = LWP_TYPE_FIX_ADDR; @@ -279,6 +310,15 @@ static void lwp_cleanup(struct rt_thread *tid) dbg_log(DBG_LOG, "lwp free memory pages\n"); rt_lwp_mem_deinit(lwp); + /* cleanup fd table */ + while (lwp->fdt.maxfd > 0) + { + lwp->fdt.maxfd --; + close(lwp->fdt.maxfd); + } + rt_free(lwp->fdt.fds); + rt_free(lwp->args); + dbg_log(DBG_LOG, "lwp free: %p\n", lwp); rt_free(lwp); @@ -299,7 +339,7 @@ static void lwp_thread(void *parameter) tid->user_data = (rt_uint32_t)lwp; tid->cleanup = lwp_cleanup; - lwp_user_entry(lwp->text_entry, lwp->data); + lwp_user_entry(lwp->args, lwp->text_entry, lwp->data); } struct rt_lwp *rt_lwp_self(void) @@ -307,7 +347,7 @@ struct rt_lwp *rt_lwp_self(void) return (struct rt_lwp *)rt_thread_self()->user_data; } -int exec(char *filename) +int exec(char *filename, int argc, char **argv) { struct rt_lwp *lwp; int result; @@ -324,6 +364,12 @@ int exec(char *filename) dbg_log(DBG_INFO, "lwp malloc : %p, size: %d!\n", lwp, sizeof(struct rt_lwp)); rt_memset(lwp, 0, sizeof(*lwp)); + if (lwp_argscopy(lwp, argc, argv) != 0) + { + rt_free(lwp); + return -ENOMEM; + } + result = lwp_load(filename, lwp, RT_NULL, 0); if (result == RT_EOK) { @@ -348,6 +394,7 @@ int exec(char *filename) } } + rt_free(lwp->args); rt_free(lwp); return -RT_ERROR; |
