From 96b2eaeab67525cb8f634f11fd6ee60e9eb7cf73 Mon Sep 17 00:00:00 2001 From: wangchen <253227059@qq.com> Date: Mon, 17 Jan 2022 07:28:45 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20thread=5Fcreate=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=9A=84=E7=BA=BF=E7=A8=8B=E6=9C=AA=E8=AE=BE=E7=BD=AEdetach?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=EF=BC=8C=E4=B8=BB=E5=8A=A8=E9=80=80=E5=87=BA?= =?UTF-8?q?=E5=90=8E=EF=BC=8COsGetAllTskInfo=E8=B0=83=E7=94=A8=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=9B=B8=E5=85=B3=E7=9A=84=E4=BB=BB=E5=8A=A1=E5=90=8D?= =?UTF-8?q?=E4=B8=BA=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【背景】thread_create创建的线程未设置detach属性,主动退出后,OsGetAllTskInfo调用后,相关的任务名为乱码 【修改方案】 修改线程退出流程 【影响】 对现有的产品编译不会有影响。 re #I4R4D3 Signed-off-by: wangchen --- kal/posix/src/pthread.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/kal/posix/src/pthread.c b/kal/posix/src/pthread.c index e1263921..585e458c 100644 --- a/kal/posix/src/pthread.c +++ b/kal/posix/src/pthread.c @@ -38,6 +38,8 @@ #include "los_config.h" #include "los_task.h" +#define PTHREAD_DEFAULT_NAME "pthread" +#define PTHREAD_DEFAULT_NAME_LEN 8 #define PTHREAD_NAMELEN 16 typedef struct { @@ -51,7 +53,7 @@ static void *PthreadEntry(UINT32 param) PthreadData *pthreadData = (PthreadData *)(UINTPTR)param; void *(*startRoutine)(void *) = pthreadData->startRoutine; void *ret = startRoutine(pthreadData->param); - free(pthreadData); + pthread_exit(ret); return ret; } @@ -69,7 +71,8 @@ static int PthreadCreateAttrInit(const pthread_attr_t *attr, void *(*startRoutin INT32 policy = 0; pthread_attr_t attrTmp; INT32 ret; - + errno_t error; + if (!attr) { (VOID)pthread_attr_init(&attrTmp); threadAttr = &attrTmp; @@ -97,6 +100,11 @@ static int PthreadCreateAttrInit(const pthread_attr_t *attr, void *(*startRoutin return ENOMEM; } + error = memcpy_s(pthreadData->name, PTHREAD_NAMELEN, PTHREAD_DEFAULT_NAME, PTHREAD_DEFAULT_NAME_LEN); + if (error != EOK) { + free(pthreadData); + return error; + } pthreadData->startRoutine = startRoutine; pthreadData->param = arg; taskInitParam->pcName = pthreadData->name; @@ -129,9 +137,6 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr, return EINVAL; } - /* set pthread default name */ - (void)sprintf_s(taskInitParam.pcName, PTHREAD_NAMELEN, "pthread%u", taskID); - (void)LOS_TaskResume(taskID); *thread = (pthread_t)taskID; @@ -219,9 +224,16 @@ int pthread_detach(pthread_t thread) void pthread_exit(void *retVal) { + UINT32 intSave; + LosTaskCB *tcb = OS_TCB_FROM_TID(LOS_CurTaskIDGet()); tcb->joinRetval = (UINTPTR)retVal; - free((PthreadData *)(UINTPTR)tcb->arg); + PthreadData *pthreadData = (PthreadData *)(UINTPTR)tcb->arg; + + intSave = LOS_IntLock(); + tcb->taskName = PTHREAD_DEFAULT_NAME; + LOS_IntRestore(intSave); + free(pthreadData); (void)LOS_TaskDelete(tcb->taskID); } @@ -240,6 +252,11 @@ int pthread_setname_np(pthread_t thread, const char *name) taskCB = OS_TCB_FROM_TID((UINT32)thread); intSave = LOS_IntLock(); + if (taskCB->taskStatus & OS_TASK_STATUS_EXIT) { + LOS_IntRestore(intSave); + return EINVAL; + } + if (taskCB->taskEntry == PthreadEntry) { (void)strcpy_s(taskName, PTHREAD_NAMELEN, name); } else {