diff --git a/kernel/include/los_task.h b/kernel/include/los_task.h index ec05e216..786f4a31 100644 --- a/kernel/include/los_task.h +++ b/kernel/include/los_task.h @@ -1503,6 +1503,11 @@ typedef struct { LOSCFG_TASK_STRUCT_EXTENSION /**< Task extension field */ } LosTaskCB; +STATIC INLINE BOOL OsTaskIsExit(const LosTaskCB *taskCB) +{ + return ((taskCB->taskStatus & OS_TASK_STATUS_EXIT) != 0); +} + typedef struct { LosTaskCB *runTask; LosTaskCB *newTask; diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c index b60b3f4f..aaa33357 100644 --- a/kernel/src/los_sched.c +++ b/kernel/src/los_sched.c @@ -268,6 +268,7 @@ VOID OsSchedTaskExit(LosTaskCB *taskCB) OsDeleteSortLink(&taskCB->sortList); taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME); } + taskCB->taskStatus |= OS_TASK_STATUS_EXIT; } VOID OsSchedYield(VOID) diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index 16ccff5d..5ec570a1 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -146,7 +146,7 @@ STATIC VOID OsRecycleTaskResources(LosTaskCB *taskCB, UINTPTR *stackPtr) taskCB->topOfStack = (UINT32)NULL; taskCB->taskStatus &= ~OS_TASK_FLAG_STACK_FREE; } - if (!(taskCB->taskStatus & OS_TASK_STATUS_EXIT)) { + if (!(taskCB->taskStatus & OS_TASK_FLAG_JOINABLE)) { OsInsertTCBToFreeList(taskCB); } } @@ -164,7 +164,7 @@ STATIC VOID OsRecyleFinishedTask(VOID) stackPtr = 0; OsRecycleTaskResources(taskCB, &stackPtr); LOS_IntRestore(intSave); - + (VOID)LOS_MemFree(OS_TASK_STACK_ADDR, (VOID *)stackPtr); intSave = LOS_IntLock(); } @@ -931,7 +931,6 @@ STATIC VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB) resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList))); OsSchedTaskWake(resumedTask); } - taskCB->taskStatus |= OS_TASK_STATUS_EXIT; } } @@ -1003,7 +1002,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskJoin(UINT32 taskID, UINTPTR *retval) } intSave = LOS_IntLock(); - taskCB->taskStatus &= ~OS_TASK_STATUS_EXIT; + taskCB->taskStatus &= ~OS_TASK_FLAG_JOINABLE; OsRecycleTaskResources(taskCB, &stackPtr); LOS_IntRestore(intSave); (VOID)LOS_MemFree(OS_TASK_STACK_ADDR, (VOID *)stackPtr); @@ -1101,8 +1100,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) } OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB); - OsSchedTaskExit(taskCB); OsTaskJoinPostUnsafe(taskCB); + OsSchedTaskExit(taskCB); LOS_EventDestroy(&(taskCB->event)); taskCB->event.uwEventID = OS_NULL_INT; @@ -1122,7 +1121,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) LOSCFG_TASK_DELETE_EXTENSION_HOOK(taskCB); if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { - if (!(taskCB->taskStatus & OS_TASK_STATUS_EXIT)) { + if (!(taskCB->taskStatus & OS_TASK_FLAG_JOINABLE)) { taskCB->taskStatus |= OS_TASK_STATUS_UNUSED; OsRunningTaskDelete(taskID, taskCB); }