From 49c93b37c5e215612bbeb4619e73c809f9eb1cac Mon Sep 17 00:00:00 2001 From: zhushengle Date: Fri, 15 Oct 2021 10:50:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E7=94=A8LOS=5FTaskDetach?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=B7=B2=E9=80=80=E5=87=BA=E7=9A=84joinable?= =?UTF-8?q?=E7=9A=84=E4=BB=BB=E5=8A=A1=E6=97=B6=EF=BC=8C=E6=9C=AA=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E5=9B=9E=E6=94=B6=E8=AF=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #I4DZL7 Signed-off-by: zhushengle Change-Id: Iac88818317c07807d0636712025f2c75b3b1f766 --- kernel/src/los_task.c | 5 ++ testsuits/sample/kernel/task/BUILD.gn | 1 + testsuits/sample/kernel/task/It_los_task.c | 1 + testsuits/sample/kernel/task/It_los_task.h | 1 + .../sample/kernel/task/It_los_task_118.c | 3 + .../sample/kernel/task/It_los_task_119.c | 3 + .../sample/kernel/task/It_los_task_123.c | 71 +++++++++++++++++++ 7 files changed, 85 insertions(+) create mode 100644 testsuits/sample/kernel/task/It_los_task_123.c 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); +} +