diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index 1deca6c5..1b406c87 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -1030,6 +1030,11 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDetach(UINT32 taskID) return LOS_ERRNO_TSK_NOT_CREATED; } + if (taskCB->taskStatus & OS_TASK_STATUS_EXIT) { + LOS_IntRestore(intSave); + return LOS_TaskJoin(taskID, NULL); + } + ret = OsTaskSetDetachUnsafe(taskCB); LOS_IntRestore(intSave); return ret; diff --git a/testsuits/sample/kernel/task/BUILD.gn b/testsuits/sample/kernel/task/BUILD.gn index fa3d32f9..ca87dd90 100644 --- a/testsuits/sample/kernel/task/BUILD.gn +++ b/testsuits/sample/kernel/task/BUILD.gn @@ -149,6 +149,7 @@ static_library("test_task") { "It_los_task_120.c", "It_los_task_121.c", "It_los_task_122.c", + "It_los_task_123.c", ] configs += [ "//kernel/liteos_m/testsuits:include" ] diff --git a/testsuits/sample/kernel/task/It_los_task.c b/testsuits/sample/kernel/task/It_los_task.c index 8a7b8783..df85478b 100644 --- a/testsuits/sample/kernel/task/It_los_task.c +++ b/testsuits/sample/kernel/task/It_los_task.c @@ -122,6 +122,7 @@ VOID ItSuiteLosTask() ItLosTask120(); ItLosTask121(); ItLosTask122(); + ItLosTask123(); #if (LOS_KERNEL_TEST_FULL == 1) ItLosTask039(); diff --git a/testsuits/sample/kernel/task/It_los_task.h b/testsuits/sample/kernel/task/It_los_task.h index b4fd5aae..1e072d2e 100644 --- a/testsuits/sample/kernel/task/It_los_task.h +++ b/testsuits/sample/kernel/task/It_los_task.h @@ -184,6 +184,7 @@ extern VOID ItLosTask119(VOID); extern VOID ItLosTask120(VOID); extern VOID ItLosTask121(VOID); extern VOID ItLosTask122(VOID); +extern VOID ItLosTask123(VOID); #ifdef __cplusplus #if __cplusplus diff --git a/testsuits/sample/kernel/task/It_los_task_118.c b/testsuits/sample/kernel/task/It_los_task_118.c index 46d0db7f..79f04c83 100644 --- a/testsuits/sample/kernel/task/It_los_task_118.c +++ b/testsuits/sample/kernel/task/It_los_task_118.c @@ -60,6 +60,9 @@ static UINT32 TestCase(VOID) ICUNIT_ASSERT_EQUAL(ret, 0, ret); ICUNIT_ASSERT_EQUAL(uwtemp, 9, uwtemp); /* 8: pthread exit code */ + ret = LOS_TaskDelete(taskID); + ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_NOT_CREATED, ret); + return LOS_OK; } diff --git a/testsuits/sample/kernel/task/It_los_task_119.c b/testsuits/sample/kernel/task/It_los_task_119.c index ea6e30f7..b3c4dd32 100644 --- a/testsuits/sample/kernel/task/It_los_task_119.c +++ b/testsuits/sample/kernel/task/It_los_task_119.c @@ -62,6 +62,9 @@ static UINT32 TestCase(VOID) ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount); + ret = LOS_TaskDelete(taskID); + ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_NOT_CREATED, ret); + return LOS_OK; } diff --git a/testsuits/sample/kernel/task/It_los_task_123.c b/testsuits/sample/kernel/task/It_los_task_123.c new file mode 100644 index 00000000..edb9aa68 --- /dev/null +++ b/testsuits/sample/kernel/task/It_los_task_123.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021-2021 Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "osTest.h" +#include "It_los_task.h" + +static VOID *TaskDeatchf01(void *argument) +{ + g_testCount++; + return NULL; +} + +static UINT32 TestCase(VOID) +{ + UINT32 ret; + UINT32 taskID; + TSK_INIT_PARAM_S osTaskInitParam = { 0 }; + + g_testCount = 0; + + osTaskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskDeatchf01; + osTaskInitParam.uwStackSize = OS_TSK_TEST_STACK_SIZE; + osTaskInitParam.pcName = "deatch"; + osTaskInitParam.usTaskPrio = TASK_PRIO_TEST - 5; /* 5: Relatively high priority */ + osTaskInitParam.uwResved = LOS_TASK_ATTR_JOINABLE; + + ret = LOS_TaskCreate(&taskID, &osTaskInitParam); + ICUNIT_ASSERT_EQUAL(ret, 0, ret); + + ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount); + + ret = LOS_TaskDetach(taskID); + ICUNIT_ASSERT_EQUAL(ret, LOS_OK, ret); + + ret = LOS_TaskDelete(taskID); + ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_NOT_CREATED, ret); + return LOS_OK; +} + +VOID ItLosTask123(VOID) // IT_Layer_ModuleORFeature_No +{ + TEST_ADD_CASE("ItLosTask123", TestCase, TEST_LOS, TEST_TASK, TEST_LEVEL0, TEST_FUNCTION); +} +