summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
authorHanhui <sylixos@gmail.com>2019-05-07 06:34:51 (GMT)
committer Hanhui <sylixos@gmail.com>2019-04-18 15:49:55 (GMT)
commit1429da87afdc2fdf9bad37c4888368f1593dc515 (patch)
tree1988132a8320d65b7c1b1195da0f64eb48ff9854
parenteec84604ce101227b604960bf1056dfd5b85d1cf (diff)
downloadAIC-OS-1429da87afdc2fdf9bad37c4888368f1593dc515.zip
Optimizing the location of pthread key recovery.
-rw-r--r--SylixOS/loader/src/loader.c14
-rw-r--r--SylixOS/loader/src/loader_vppatch.c10
2 files changed, 14 insertions, 10 deletions
diff --git a/SylixOS/loader/src/loader.c b/SylixOS/loader/src/loader.c
index e8a2c32..5bd95ce 100644
--- a/SylixOS/loader/src/loader.c
+++ b/SylixOS/loader/src/loader.c
@@ -64,6 +64,12 @@
#include "../elf/elf_arch.h"
#endif /* defined(LW_CFG_CPU_ARCH_C6X)*/
/*********************************************************************************************************
+ POSIX
+*********************************************************************************************************/
+#if LW_CFG_POSIX_EN > 0
+VOID _PthreadKeyCleanup(PLW_CLASS_TCB ptcbDel);
+#endif /* LW_CFG_POSIX_EN > 0 */
+/*********************************************************************************************************
模块进程模型
SylixOS 使用一个虚拟地址空间映射关系, 所以这里面的进程只能称为一个没有独立寻址空间的进程框架, 主要是为了
@@ -1036,6 +1042,9 @@ INT API_ModuleFinish (PVOID pvVProc)
{
LW_LD_VPROC *pvproc = (LW_LD_VPROC *)pvVProc;
LW_LD_EXEC_MODULE *pmodule;
+#if LW_CFG_POSIX_EN > 0
+ PLW_CLASS_TCB ptcbCur;
+#endif /* LW_CFG_POSIX_EN > 0 */
if (pvproc == LW_NULL) {
_ErrorHandle(ERROR_LOADER_PARAM_NULL);
@@ -1052,6 +1061,11 @@ INT API_ModuleFinish (PVOID pvVProc)
finiArrayCall(pmodule, !pvproc->VP_bImmediatelyTerm); /* 调用c++析构函数代码 */
+#if LW_CFG_POSIX_EN > 0
+ LW_TCB_GET_CUR_SAFE(ptcbCur);
+ _PthreadKeyCleanup(ptcbCur); /* 提前执行 key cleanup 操作 */
+#endif /* LW_CFG_POSIX_EN > 0 */
+
__moduleVpPatchFini(pmodule);
return (ERROR_NONE);
diff --git a/SylixOS/loader/src/loader_vppatch.c b/SylixOS/loader/src/loader_vppatch.c
index 82690d8..aa6dab7 100644
--- a/SylixOS/loader/src/loader_vppatch.c
+++ b/SylixOS/loader/src/loader_vppatch.c
@@ -103,12 +103,6 @@ INT vprocProcAdd(LW_LD_VPROC *pvproc);
INT vprocProcDelete(LW_LD_VPROC *pvproc);
#endif /* LW_CFG_PROCFS_EN > 0 */
/*********************************************************************************************************
- POSIX
-*********************************************************************************************************/
-#if LW_CFG_POSIX_EN > 0
-VOID _PthreadKeyCleanup(PLW_CLASS_TCB ptcbDel);
-#endif /* LW_CFG_POSIX_EN > 0 */
-/*********************************************************************************************************
** 函数名称: __moduleVpPatchVersion
** 功能描述: vp 补丁版本
** 输 入 : pmodule 进程主模块句柄
@@ -1101,10 +1095,6 @@ __recheck:
#if LW_CFG_THREAD_EXT_EN > 0
_TCBCleanupPopExt(ptcbCur); /* 提前执行 cleanup pop 操作 */
#endif /* LW_CFG_THREAD_EXT_EN > 0 */
-
-#if LW_CFG_POSIX_EN > 0
- _PthreadKeyCleanup(ptcbCur); /* 提前执行 key cleanup 操作 */
-#endif /* LW_CFG_POSIX_EN > 0 */
if (pvproc->VP_iExitMode == LW_VPROC_EXIT_FORCE) { /* 强制退出删除除主线程外的线程*/
vprocThreadKill(pvproc, ptcbCur);