fix: 解决定时器超时但还在队列中无法删除的问题
利用每次创建时,软件定时器timerId都是唯一的(0~0xffffffff循环),在超时写队列时,同时记录软件定时器id,删除的时候更新软件定时器id,那么在处理软件定时器前, 通过队列中记录的id获取软件定时器控制块,如果控制块的id不等于记录的id,那么说明该软件定时器被删除过,将不执行对应回调函数,表现为删除该定时器。 BREAKING CHANGE: SwtmrHandlerItem结构体新增swtmrID字段,用于标识超时队列中软件定时器id Close #I4LFVD Signed-off-by: JerryH <huangjieliang@huawei.com> Change-Id: I716176f177c4bc07adb348936d5568fbadcbebe7
This commit is contained in:
@@ -40,7 +40,7 @@ static VOID SwtmrF01(VOID)
|
||||
ret = LOS_EventWrite(&g_pevent, 0xF);
|
||||
ICUNIT_ASSERT_EQUAL_VOID(ret, LOS_OK, ret);
|
||||
|
||||
ret = LOS_EventRead(&g_pevent, 0xF, LOS_WAITMODE_AND, LOS_WAIT_FOREVER);
|
||||
ret = LOS_EventPoll(&g_pevent.uwEventID, 0xF, LOS_WAITMODE_AND);
|
||||
ICUNIT_ASSERT_EQUAL_VOID(ret, g_pevent.uwEventID, ret);
|
||||
ICUNIT_ASSERT_EQUAL_VOID(ret, 0xF, ret);
|
||||
|
||||
|
||||
@@ -113,6 +113,7 @@ VOID ItSuiteLosSwtmr(void)
|
||||
ItLosSwtmr076();
|
||||
ItLosSwtmr077();
|
||||
ItLosSwtmr078();
|
||||
ItLosSwtmr079();
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
ItLosSwtmrAlign005();
|
||||
ItLosSwtmrAlign006();
|
||||
|
||||
@@ -147,6 +147,7 @@ extern VOID ItLosSwtmr075(VOID);
|
||||
extern VOID ItLosSwtmr076(VOID);
|
||||
extern VOID ItLosSwtmr077(VOID);
|
||||
extern VOID ItLosSwtmr078(VOID);
|
||||
extern VOID ItLosSwtmr079(VOID);
|
||||
|
||||
extern VOID ItLosSwtmrAlign001(VOID);
|
||||
extern VOID ItLosSwtmrAlign002(VOID);
|
||||
|
||||
@@ -39,7 +39,7 @@ static UINT32 Testcase(VOID)
|
||||
UINT32 swTmrID = 0xfffffff; // LOSCFG_BASE_CORE_SWTMR_LIMIT.
|
||||
|
||||
ret = LOS_SwtmrDelete(swTmrID);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
return LOS_OK;
|
||||
EXIT:
|
||||
|
||||
@@ -74,7 +74,7 @@ static UINT32 Testcase(VOID)
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrTimeGet(swTmrID, &tick);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 1, g_testCount, EXIT);
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ static VOID SwtmrF01(UINT32 arg)
|
||||
}
|
||||
|
||||
ret = LOS_SwtmrTimeGet(g_swtmrId1, &tick);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
g_testCount++;
|
||||
return;
|
||||
@@ -80,7 +80,7 @@ static UINT32 Testcase(VOID)
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrTimeGet(g_swtmrId1, &tick);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 1, g_testCount, EXIT);
|
||||
|
||||
#if (TIMER_LOS_SELF_DELETED == 0)
|
||||
|
||||
@@ -93,10 +93,10 @@ static UINT32 Testcase(VOID)
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 1, g_testCount, EXIT);
|
||||
|
||||
ret = LOS_SwtmrDelete(g_swtmrId1);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrTimeGet(g_swtmrId1, &tick);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
#if (TIMER_LOS_SELF_DELETED == 0)
|
||||
ret = LOS_SwtmrDelete(g_swtmrId1);
|
||||
|
||||
@@ -101,7 +101,7 @@ static UINT32 Testcase(VOID)
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 1, g_testCount, EXIT);
|
||||
|
||||
ret = LOS_SwtmrTimeGet(swTmrID, &tick);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
#if (TIMER_LOS_SELF_DELETED == 0)
|
||||
ret = LOS_SwtmrDelete(swTmrID);
|
||||
|
||||
@@ -60,13 +60,13 @@ static UINT32 Testcase(VOID)
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_MODE_INVALID, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrStart(swTmrID);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
ret = LOS_TaskDelay(10); // 10, set delay time.
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrDelete(swTmrID);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 0, g_testCount, EXIT);
|
||||
|
||||
|
||||
@@ -59,13 +59,13 @@ static UINT32 Testcase(VOID)
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_MODE_INVALID, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrStart(swTmrID);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
ret = LOS_TaskDelay(10); // 10, set delay time.
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrDelete(swTmrID);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_ID_INVALID, ret, EXIT);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_ERRNO_SWTMR_NOT_CREATED, ret, EXIT);
|
||||
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 0, g_testCount, EXIT);
|
||||
|
||||
|
||||
105
testsuites/sample/kernel/swtmr/It_los_swtmr_079.c
Normal file
105
testsuites/sample/kernel/swtmr/It_los_swtmr_079.c
Normal file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-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_swtmr.h"
|
||||
|
||||
static UINT32 g_swTmrID1;
|
||||
static UINT32 g_swTmrID2;
|
||||
|
||||
static VOID SwtmrF01(UINT32 arg)
|
||||
{
|
||||
if (arg != TIMER_LOS_HANDLER_PARAMETER) {
|
||||
return;
|
||||
}
|
||||
|
||||
LOS_SwtmrDelete(g_swTmrID2);
|
||||
|
||||
g_testCount++;
|
||||
return;
|
||||
}
|
||||
|
||||
static VOID SwtmrF02(UINT32 arg)
|
||||
{
|
||||
if (arg != TIMER_LOS_HANDLER_PARAMETER) {
|
||||
return;
|
||||
}
|
||||
|
||||
g_testCount++;
|
||||
return;
|
||||
}
|
||||
|
||||
static UINT32 Testcase(VOID)
|
||||
{
|
||||
UINT32 ret;
|
||||
g_testCount = 0;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
ret = LOS_SwtmrCreate(TIMER_LOS_EXPIRATION1, LOS_SWTMR_MODE_ONCE,
|
||||
(SWTMR_PROC_FUNC)SwtmrF01, &g_swTmrID1, TIMER_LOS_HANDLER_PARAMETER,
|
||||
OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);
|
||||
#else
|
||||
ret = LOS_SwtmrCreate(TIMER_LOS_EXPIRATION1, LOS_SWTMR_MODE_ONCE,
|
||||
(SWTMR_PROC_FUNC)SwtmrF01, &g_swTmrID1, TIMER_LOS_HANDLER_PARAMETER);
|
||||
#endif
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
ret = LOS_SwtmrCreate(TIMER_LOS_EXPIRATION1, LOS_SWTMR_MODE_ONCE,
|
||||
(SWTMR_PROC_FUNC)SwtmrF02, &g_swTmrID2, TIMER_LOS_HANDLER_PARAMETER,
|
||||
OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);
|
||||
#else
|
||||
ret = LOS_SwtmrCreate(TIMER_LOS_EXPIRATION1, LOS_SWTMR_MODE_ONCE,
|
||||
(SWTMR_PROC_FUNC)SwtmrF02, &g_swTmrID2, TIMER_LOS_HANDLER_PARAMETER);
|
||||
#endif
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrStart(g_swTmrID1);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_SwtmrStart(g_swTmrID2);
|
||||
ICUNIT_GOTO_EQUAL(ret, LOS_OK, ret, EXIT);
|
||||
|
||||
ret = LOS_TaskDelay(10); // 10, set delay time.
|
||||
ICUNIT_GOTO_EQUAL(g_testCount, 1, g_testCount, EXIT);
|
||||
|
||||
return LOS_OK;
|
||||
|
||||
EXIT:
|
||||
LOS_SwtmrDelete(g_swTmrID1);
|
||||
LOS_SwtmrDelete(g_swTmrID2);
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
VOID ItLosSwtmr079(VOID)
|
||||
{
|
||||
TEST_ADD_CASE("ItLosSwtmr079", Testcase, TEST_LOS, TEST_SWTMR, TEST_LEVEL0, TEST_FUNCTION);
|
||||
}
|
||||
@@ -31,13 +31,13 @@
|
||||
#include "osTest.h"
|
||||
#include "It_los_task.h"
|
||||
|
||||
static VOID *TaskDeatchf01(void *argument)
|
||||
static int TaskDeatchf01(UINT32 argument)
|
||||
{
|
||||
int ret = LOS_TaskDetach(LOS_CurTaskIDGet());
|
||||
ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_NOT_JOIN, ret);
|
||||
|
||||
g_testCount++;
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINT32 TestCase(VOID)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#include "osTest.h"
|
||||
#include "It_los_task.h"
|
||||
|
||||
static VOID *TaskDeatchf01(void *argument)
|
||||
static int TaskDeatchf01(UINT32 argument)
|
||||
{
|
||||
UINT32 ret = LOS_TaskDetach(LOS_CurTaskIDGet());
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
@@ -39,7 +39,7 @@ static VOID *TaskDeatchf01(void *argument)
|
||||
g_testCount++;
|
||||
|
||||
LOS_TaskDelay(1000); /* 1000 ticks */
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINT32 TestCase(VOID)
|
||||
@@ -64,6 +64,8 @@ static UINT32 TestCase(VOID)
|
||||
ret = LOS_TaskJoin(taskID, NULL);
|
||||
ICUNIT_ASSERT_EQUAL(ret, LOS_NOK, ret);
|
||||
|
||||
LOS_TaskDelay(1500); /* 1500 ticks wait for the end of child task. */
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#include "osTest.h"
|
||||
#include "It_los_task.h"
|
||||
|
||||
static VOID *TaskDeatchf01(void *argument)
|
||||
static int TaskDeatchf01(UINT32 argument)
|
||||
{
|
||||
UINT32 ret = LOS_TaskDetach(LOS_CurTaskIDGet());
|
||||
ICUNIT_ASSERT_EQUAL(ret, LOS_NOK, ret);
|
||||
@@ -39,7 +39,7 @@ static VOID *TaskDeatchf01(void *argument)
|
||||
g_testCount++;
|
||||
|
||||
LOS_TaskDelay(1000); /* 1000 ticks */
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINT32 TestCase(VOID)
|
||||
@@ -63,6 +63,8 @@ static UINT32 TestCase(VOID)
|
||||
ret = LOS_TaskJoin(taskID, NULL);
|
||||
ICUNIT_ASSERT_EQUAL(ret, LOS_NOK, ret);
|
||||
|
||||
LOS_TaskDelay(1500); /* 1500 ticks wait for the end of child task. */
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,12 +39,12 @@ static VOID *TaskJoinf01(void *argument)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static VOID *TaskJoinf02(VOID *argument)
|
||||
static int TaskJoinf02(VOID *argument)
|
||||
{
|
||||
UINT32 ret = LOS_TaskDelete(g_joinTaskID);
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINT32 TestCase(VOID)
|
||||
|
||||
Reference in New Issue
Block a user