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:
JerryH
2021-12-07 15:05:48 +08:00
parent d3bf180b7f
commit ecce17ea48
18 changed files with 163 additions and 36 deletions

View File

@@ -808,6 +808,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
LosTaskCB *taskCB = NULL;
UINT16 tempStatus;
UINT32 retErr = OS_ERROR;
BOOL needSched = FALSE;
if (taskID > LOSCFG_BASE_CORE_TSK_LIMIT) {
return LOS_ERRNO_TSK_ID_INVALID;
@@ -825,7 +826,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
OS_GOTO_ERREND();
}
BOOL needSched = OsSchedResume(taskCB);
needSched = OsSchedResume(taskCB);
if (needSched && g_taskScheduled) {
LOS_IntRestore(intSave);
LOS_Schedule();