Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos A
提交
e4cad073
K
Kernel Liteos A
项目概览
OpenHarmony
/
Kernel Liteos A
大约 1 年 前同步成功
通知
454
Star
414
Fork
55
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
e4cad073
编写于
3月 16, 2022
作者:
O
openharmony_ci
提交者:
Gitee
3月 16, 2022
浏览文件
操作
浏览文件
下载
差异文件
!835 fix: 修复任务部分接口防护
Merge pull request !835 from zhushengle/task
上级
40329e18
b151fa6b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
38 addition
and
36 deletion
+38
-36
kernel/base/core/los_task.c
kernel/base/core/los_task.c
+38
-36
未找到文件。
kernel/base/core/los_task.c
浏览文件 @
e4cad073
...
...
@@ -120,11 +120,9 @@ VOID OsTaskInsertToRecycleList(LosTaskCB *taskCB)
LITE_OS_SEC_TEXT_INIT
VOID
OsTaskJoinPostUnsafe
(
LosTaskCB
*
taskCB
)
{
LosTaskCB
*
resumedTask
=
NULL
;
if
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
)
{
if
(
!
LOS_ListEmpty
(
&
taskCB
->
joinList
))
{
resumedTask
=
OS_TCB_FROM_PENDLIST
(
LOS_DL_LIST_FIRST
(
&
(
taskCB
->
joinList
)));
LosTaskCB
*
resumedTask
=
OS_TCB_FROM_PENDLIST
(
LOS_DL_LIST_FIRST
(
&
(
taskCB
->
joinList
)));
OsTaskWakeClearPendMask
(
resumedTask
);
OsSchedTaskWake
(
resumedTask
);
}
...
...
@@ -369,12 +367,11 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
LITE_OS_SEC_TEXT
VOID
OsTaskCBRecycleToFree
()
{
LosTaskCB
*
taskCB
=
NULL
;
UINT32
intSave
;
SCHEDULER_LOCK
(
intSave
);
while
(
!
LOS_ListEmpty
(
&
g_taskRecycleList
))
{
taskCB
=
OS_TCB_FROM_PENDLIST
(
LOS_DL_LIST_FIRST
(
&
g_taskRecycleList
));
LosTaskCB
*
taskCB
=
OS_TCB_FROM_PENDLIST
(
LOS_DL_LIST_FIRST
(
&
g_taskRecycleList
));
LOS_ListDelete
(
&
taskCB
->
pendList
);
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -391,8 +388,6 @@ LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree()
*/
LITE_OS_SEC_TEXT_INIT
VOID
OsTaskEntry
(
UINT32
taskID
)
{
LosTaskCB
*
taskCB
=
NULL
;
LOS_ASSERT
(
!
OS_TID_CHECK_INVALID
(
taskID
));
/*
...
...
@@ -403,7 +398,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
LOS_SpinUnlock
(
&
g_taskSpin
);
(
VOID
)
LOS_IntUnLock
();
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
taskCB
->
joinRetval
=
taskCB
->
taskEntry
(
taskCB
->
args
[
0
],
taskCB
->
args
[
1
],
taskCB
->
args
[
2
],
taskCB
->
args
[
3
]);
/* 2 & 3: just for args array index */
if
(
!
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
))
{
...
...
@@ -530,7 +525,6 @@ STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
LITE_OS_SEC_TEXT
LosTaskCB
*
OsGetFreeTaskCB
(
VOID
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
NULL
;
SCHEDULER_LOCK
(
intSave
);
if
(
LOS_ListEmpty
(
&
g_losFreeTask
))
{
...
...
@@ -539,7 +533,7 @@ LITE_OS_SEC_TEXT LosTaskCB *OsGetFreeTaskCB(VOID)
return
NULL
;
}
taskCB
=
OS_TCB_FROM_PENDLIST
(
LOS_DL_LIST_FIRST
(
&
g_losFreeTask
));
LosTaskCB
*
taskCB
=
OS_TCB_FROM_PENDLIST
(
LOS_DL_LIST_FIRST
(
&
g_losFreeTask
));
LOS_ListDelete
(
LOS_DL_LIST_FIRST
(
&
g_losFreeTask
));
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -550,8 +544,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S
{
UINT32
intSave
,
errRet
;
VOID
*
topStack
=
NULL
;
VOID
*
stackPtr
=
NULL
;
LosTaskCB
*
taskCB
=
NULL
;
VOID
*
pool
=
NULL
;
errRet
=
OsTaskCreateParamCheck
(
taskID
,
initParam
,
&
pool
);
...
...
@@ -559,7 +551,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S
return
errRet
;
}
taskCB
=
OsGetFreeTaskCB
();
LosTaskCB
*
taskCB
=
OsGetFreeTaskCB
();
if
(
taskCB
==
NULL
)
{
errRet
=
LOS_ERRNO_TSK_TCB_UNAVAILABLE
;
goto
LOS_ERREND
;
...
...
@@ -576,7 +568,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S
goto
LOS_ERREND_REWIND_SYNC
;
}
stackPtr
=
OsTaskStackInit
(
taskCB
->
taskID
,
initParam
->
uwStackSize
,
topStack
,
TRUE
);
VOID
*
stackPtr
=
OsTaskStackInit
(
taskCB
->
taskID
,
initParam
->
uwStackSize
,
topStack
,
TRUE
);
errRet
=
OsTaskCBInit
(
taskCB
,
initParam
,
stackPtr
,
topStack
);
if
(
errRet
!=
LOS_OK
)
{
goto
LOS_ERREND_TCB_INIT
;
...
...
@@ -746,14 +738,13 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend(LosTaskCB *taskCB)
LITE_OS_SEC_TEXT_INIT
UINT32
LOS_TaskSuspend
(
UINT32
taskID
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
NULL
;
UINT32
errRet
;
if
(
OS_TID_CHECK_INVALID
(
taskID
))
{
return
LOS_ERRNO_TSK_ID_INVALID
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
if
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_SYSTEM_TASK
)
{
return
LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK
;
}
...
...
@@ -872,6 +863,10 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
if
(
taskCB
==
OsCurrTaskGet
())
{
if
(
!
OsPreemptable
())
{
return
LOS_ERRNO_TSK_DELETE_LOCKED
;
}
OsRunningTaskToExit
(
taskCB
,
OS_PRO_EXIT_OK
);
return
LOS_NOK
;
}
...
...
@@ -909,14 +904,13 @@ LOS_ERREND:
LITE_OS_SEC_TEXT
UINT32
LOS_TaskDelay
(
UINT32
tick
)
{
UINT32
intSave
;
LosTaskCB
*
runTask
=
NULL
;
if
(
OS_INT_ACTIVE
)
{
PRINT_ERR
(
"In interrupt not allow delay task!
\n
"
);
return
LOS_ERRNO_TSK_DELAY_IN_INT
;
}
runTask
=
OsCurrTaskGet
();
LosTaskCB
*
runTask
=
OsCurrTaskGet
();
if
(
runTask
->
taskStatus
&
OS_TASK_FLAG_SYSTEM_TASK
)
{
OsBackTrace
();
return
LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK
;
...
...
@@ -941,14 +935,13 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
LITE_OS_SEC_TEXT_MINOR
UINT16
LOS_TaskPriGet
(
UINT32
taskID
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
NULL
;
UINT16
priority
;
if
(
OS_TID_CHECK_INVALID
(
taskID
))
{
return
(
UINT16
)
OS_INVALID
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -963,7 +956,6 @@ LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskID)
LITE_OS_SEC_TEXT_MINOR
UINT32
LOS_TaskPriSet
(
UINT32
taskID
,
UINT16
taskPrio
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
NULL
;
if
(
taskPrio
>
OS_TASK_PRIORITY_LOWEST
)
{
return
LOS_ERRNO_TSK_PRIOR_ERROR
;
...
...
@@ -973,7 +965,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
return
LOS_ERRNO_TSK_ID_INVALID
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
if
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_SYSTEM_TASK
)
{
return
LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK
;
}
...
...
@@ -1048,7 +1040,6 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
LITE_OS_SEC_TEXT_MINOR
UINT32
LOS_TaskInfoGet
(
UINT32
taskID
,
TSK_INFO_S
*
taskInfo
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
NULL
;
if
(
taskInfo
==
NULL
)
{
return
LOS_ERRNO_TSK_PTR_NULL
;
...
...
@@ -1058,7 +1049,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskID, TSK_INFO_S *taskInf
return
LOS_ERRNO_TSK_ID_INVALID
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -1116,7 +1107,6 @@ LITE_OS_SEC_TEXT BOOL OsTaskCpuAffiSetUnsafe(UINT32 taskID, UINT16 newCpuAffiMas
LITE_OS_SEC_TEXT_MINOR
UINT32
LOS_TaskCpuAffiSet
(
UINT32
taskID
,
UINT16
cpuAffiMask
)
{
LosTaskCB
*
taskCB
=
NULL
;
BOOL
needSched
=
FALSE
;
UINT32
intSave
;
UINT16
currCpuMask
;
...
...
@@ -1129,7 +1119,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet(UINT32 taskID, UINT16 cpuAffiMa
return
LOS_ERRNO_TSK_CPU_AFFINITY_MASK_ERR
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -1150,7 +1140,6 @@ LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskCpuAffiGet(UINT32 taskID)
{
#ifdef LOSCFG_KERNEL_SMP
#define INVALID_CPU_AFFI_MASK 0
LosTaskCB
*
taskCB
=
NULL
;
UINT16
cpuAffiMask
;
UINT32
intSave
;
...
...
@@ -1158,7 +1147,7 @@ LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskCpuAffiGet(UINT32 taskID)
return
INVALID_CPU_AFFI_MASK
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -1350,14 +1339,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsCreateUserTask(UINT32 processID, TSK_INIT_PARAM_S
LITE_OS_SEC_TEXT
INT32
LOS_GetTaskScheduler
(
INT32
taskID
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
NULL
;
INT32
policy
;
if
(
OS_TID_CHECK_INVALID
(
taskID
))
{
return
-
LOS_EINVAL
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
policy
=
-
LOS_EINVAL
;
...
...
@@ -1388,8 +1376,18 @@ LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16
return
LOS_EINVAL
;
}
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
if
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_SYSTEM_TASK
)
{
return
LOS_EPERM
;
}
SCHEDULER_LOCK
(
intSave
);
needSched
=
OsSchedModifyTaskSchedParam
(
OS_TCB_FROM_TID
(
taskID
),
policy
,
priority
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
LOS_EINVAL
;
}
needSched
=
OsSchedModifyTaskSchedParam
(
taskCB
,
policy
,
priority
);
SCHEDULER_UNLOCK
(
intSave
);
LOS_MpSchedule
(
OS_MP_CPU_ALL
);
...
...
@@ -1414,9 +1412,15 @@ STATIC UINT32 OsTaskJoinCheck(UINT32 taskID)
return
LOS_EINVAL
;
}
if
(
taskID
==
OsCurrTaskGet
()
->
taskID
)
{
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
if
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_SYSTEM_TASK
)
{
return
LOS_EPERM
;
}
if
(
taskCB
==
OsCurrTaskGet
())
{
return
LOS_EDEADLK
;
}
return
LOS_OK
;
}
...
...
@@ -1424,7 +1428,6 @@ UINT32 LOS_TaskJoin(UINT32 taskID, UINTPTR *retval)
{
UINT32
intSave
;
LosTaskCB
*
runTask
=
OsCurrTaskGet
();
LosTaskCB
*
taskCB
=
NULL
;
UINT32
errRet
;
errRet
=
OsTaskJoinCheck
(
taskID
);
...
...
@@ -1432,7 +1435,7 @@ UINT32 LOS_TaskJoin(UINT32 taskID, UINTPTR *retval)
return
errRet
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
...
...
@@ -1465,7 +1468,6 @@ UINT32 LOS_TaskDetach(UINT32 taskID)
{
UINT32
intSave
;
LosTaskCB
*
runTask
=
OsCurrTaskGet
();
LosTaskCB
*
taskCB
=
NULL
;
UINT32
errRet
;
if
(
OS_TID_CHECK_INVALID
(
taskID
))
{
...
...
@@ -1476,7 +1478,7 @@ UINT32 LOS_TaskDetach(UINT32 taskID)
return
LOS_EINTR
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录