Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos A
提交
2f6cd463
K
Kernel Liteos A
项目概览
OpenHarmony
/
Kernel Liteos A
大约 2 年 前同步成功
通知
475
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看板
提交
2f6cd463
编写于
10月 28, 2021
作者:
O
openharmony_ci
提交者:
Gitee
10月 28, 2021
浏览文件
操作
浏览文件
下载
差异文件
!664 feat: 支持LOS_TaskJoin 和 LOS_TaskDetach
Merge pull request !664 from zhushengle/Join
上级
ea45982e
37bc11fa
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
250 addition
and
116 deletion
+250
-116
compat/posix/src/pthread.c
compat/posix/src/pthread.c
+1
-1
kernel/base/core/los_process.c
kernel/base/core/los_process.c
+1
-3
kernel/base/core/los_task.c
kernel/base/core/los_task.c
+191
-97
kernel/base/include/los_task_pri.h
kernel/base/include/los_task_pri.h
+0
-9
kernel/include/los_task.h
kernel/include/los_task.h
+52
-1
syscall/los_syscall.h
syscall/los_syscall.h
+1
-1
syscall/process_syscall.c
syscall/process_syscall.c
+3
-3
syscall/syscall_lookup.h
syscall/syscall_lookup.h
+1
-1
未找到文件。
compat/posix/src/pthread.c
浏览文件 @
2f6cd463
...
@@ -248,7 +248,7 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
...
@@ -248,7 +248,7 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
taskInitParam
.
uwResved
=
LOS_TASK_STATUS_DETACHED
;
taskInitParam
.
uwResved
=
LOS_TASK_STATUS_DETACHED
;
}
else
{
}
else
{
/* Set the pthread default joinable */
/* Set the pthread default joinable */
taskInitParam
.
uwResved
=
0
;
taskInitParam
.
uwResved
=
LOS_TASK_ATTR_JOINABLE
;
}
}
PthreadReap
();
PthreadReap
();
...
...
kernel/base/core/los_process.c
浏览文件 @
2f6cd463
...
@@ -1668,9 +1668,7 @@ STATIC VOID OsInitCopyTaskParam(LosProcessCB *childProcessCB, const CHAR *name,
...
@@ -1668,9 +1668,7 @@ STATIC VOID OsInitCopyTaskParam(LosProcessCB *childProcessCB, const CHAR *name,
childPara
->
usTaskPrio
=
mainThread
->
priority
;
childPara
->
usTaskPrio
=
mainThread
->
priority
;
childPara
->
processID
=
childProcessCB
->
processID
;
childPara
->
processID
=
childProcessCB
->
processID
;
if
(
mainThread
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
)
{
if
(
mainThread
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
)
{
childPara
->
uwResved
=
OS_TASK_FLAG_PTHREAD_JOIN
;
childPara
->
uwResved
=
LOS_TASK_ATTR_JOINABLE
;
}
else
if
(
mainThread
->
taskStatus
&
OS_TASK_FLAG_DETACHED
)
{
childPara
->
uwResved
=
OS_TASK_FLAG_DETACHED
;
}
}
SCHEDULER_UNLOCK
(
intSave
);
SCHEDULER_UNLOCK
(
intSave
);
...
...
kernel/base/core/los_task.c
浏览文件 @
2f6cd463
...
@@ -135,7 +135,6 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
...
@@ -135,7 +135,6 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
OsTaskWakeClearPendMask
(
resumedTask
);
OsTaskWakeClearPendMask
(
resumedTask
);
OsSchedTaskWake
(
resumedTask
);
OsSchedTaskWake
(
resumedTask
);
}
}
taskCB
->
taskStatus
&=
~
OS_TASK_FLAG_PTHREAD_JOIN
;
}
}
taskCB
->
taskStatus
|=
OS_TASK_STATUS_EXIT
;
taskCB
->
taskStatus
|=
OS_TASK_STATUS_EXIT
;
}
}
...
@@ -151,11 +150,13 @@ LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
...
@@ -151,11 +150,13 @@ LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
return
LOS_EINVAL
;
return
LOS_EINVAL
;
}
}
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_EXIT
)
{
return
LOS_OK
;
}
if
((
taskCB
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
)
&&
LOS_ListEmpty
(
&
taskCB
->
joinList
))
{
if
((
taskCB
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
)
&&
LOS_ListEmpty
(
&
taskCB
->
joinList
))
{
OsTaskWaitSetPendMask
(
OS_TASK_WAIT_JOIN
,
taskCB
->
taskID
,
LOS_WAIT_FOREVER
);
OsTaskWaitSetPendMask
(
OS_TASK_WAIT_JOIN
,
taskCB
->
taskID
,
LOS_WAIT_FOREVER
);
return
OsSchedTaskWait
(
&
taskCB
->
joinList
,
LOS_WAIT_FOREVER
,
TRUE
);
return
OsSchedTaskWait
(
&
taskCB
->
joinList
,
LOS_WAIT_FOREVER
,
TRUE
);
}
else
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_EXIT
)
{
return
LOS_OK
;
}
}
return
LOS_EINVAL
;
return
LOS_EINVAL
;
...
@@ -172,7 +173,6 @@ LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
...
@@ -172,7 +173,6 @@ LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
if
(
LOS_ListEmpty
(
&
(
taskCB
->
joinList
)))
{
if
(
LOS_ListEmpty
(
&
(
taskCB
->
joinList
)))
{
LOS_ListDelete
(
&
(
taskCB
->
joinList
));
LOS_ListDelete
(
&
(
taskCB
->
joinList
));
taskCB
->
taskStatus
&=
~
OS_TASK_FLAG_PTHREAD_JOIN
;
taskCB
->
taskStatus
&=
~
OS_TASK_FLAG_PTHREAD_JOIN
;
taskCB
->
taskStatus
|=
OS_TASK_FLAG_DETACHED
;
return
LOS_OK
;
return
LOS_OK
;
}
}
/* This error code has a special purpose and is not allowed to appear again on the interface */
/* This error code has a special purpose and is not allowed to appear again on the interface */
...
@@ -262,6 +262,89 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
...
@@ -262,6 +262,89 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
return
runTask
->
taskID
;
return
runTask
->
taskID
;
}
}
STATIC
INLINE
UINT32
OsTaskSyncCreate
(
LosTaskCB
*
taskCB
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32
ret
=
LOS_SemCreate
(
0
,
&
taskCB
->
syncSignal
);
if
(
ret
!=
LOS_OK
)
{
return
LOS_ERRNO_TSK_MP_SYNC_RESOURCE
;
}
#else
(
VOID
)
taskCB
;
#endif
return
LOS_OK
;
}
STATIC
INLINE
VOID
OsTaskSyncDestroy
(
UINT32
syncSignal
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
(
VOID
)
LOS_SemDelete
(
syncSignal
);
#else
(
VOID
)
syncSignal
;
#endif
}
#ifdef LOSCFG_KERNEL_SMP
STATIC
INLINE
UINT32
OsTaskSyncWait
(
const
LosTaskCB
*
taskCB
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32
ret
=
LOS_OK
;
LOS_ASSERT
(
LOS_SpinHeld
(
&
g_taskSpin
));
LOS_SpinUnlock
(
&
g_taskSpin
);
/*
* gc soft timer works every OS_MP_GC_PERIOD period, to prevent this timer
* triggered right at the timeout has reached, we set the timeout as double
* of the gc peroid.
*/
if
(
LOS_SemPend
(
taskCB
->
syncSignal
,
OS_MP_GC_PERIOD
*
2
)
!=
LOS_OK
)
{
ret
=
LOS_ERRNO_TSK_MP_SYNC_FAILED
;
}
LOS_SpinLock
(
&
g_taskSpin
);
return
ret
;
#else
(
VOID
)
taskCB
;
return
LOS_OK
;
#endif
}
#endif
STATIC
INLINE
VOID
OsTaskSyncWake
(
const
LosTaskCB
*
taskCB
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
(
VOID
)
OsSemPostUnsafe
(
taskCB
->
syncSignal
,
NULL
);
#else
(
VOID
)
taskCB
;
#endif
}
STATIC
VOID
OsTaskReleaseHoldLock
(
LosProcessCB
*
processCB
,
LosTaskCB
*
taskCB
)
{
LosMux
*
mux
=
NULL
;
UINT32
ret
;
while
(
!
LOS_ListEmpty
(
&
taskCB
->
lockList
))
{
mux
=
LOS_DL_LIST_ENTRY
(
LOS_DL_LIST_FIRST
(
&
taskCB
->
lockList
),
LosMux
,
holdList
);
ret
=
OsMuxUnlockUnsafe
(
taskCB
,
mux
,
NULL
);
if
(
ret
!=
LOS_OK
)
{
LOS_ListDelete
(
&
mux
->
holdList
);
PRINT_ERR
(
"mux ulock failed! : %u
\n
"
,
ret
);
}
}
#ifdef LOSCFG_KERNEL_VM
if
(
processCB
->
processMode
==
OS_USER_MODE
)
{
OsFutexNodeDeleteFromFutexHash
(
&
taskCB
->
futex
,
TRUE
,
NULL
,
NULL
);
}
#endif
OsTaskJoinPostUnsafe
(
taskCB
);
OsTaskSyncWake
(
taskCB
);
}
LITE_OS_SEC_TEXT
VOID
OsTaskToExit
(
LosTaskCB
*
taskCB
,
UINT32
status
)
LITE_OS_SEC_TEXT
VOID
OsTaskToExit
(
LosTaskCB
*
taskCB
,
UINT32
status
)
{
{
UINT32
intSave
;
UINT32
intSave
;
...
@@ -280,14 +363,14 @@ LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status)
...
@@ -280,14 +363,14 @@ LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status)
return
;
return
;
}
}
/* The thread being killed must be able to exit automatically and will have the detached property */
if
((
taskCB
->
taskStatus
&
OS_TASK_FLAG_EXIT_KILL
)
||
!
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
))
{
OsTaskJoinPostUnsafe
(
taskCB
);
if
(
taskCB
->
taskStatus
&
(
OS_TASK_FLAG_DETACHED
|
OS_TASK_FLAG_EXIT_KILL
))
{
UINT32
ret
=
OsTaskDeleteUnsafe
(
taskCB
,
status
,
intSave
);
UINT32
ret
=
OsTaskDeleteUnsafe
(
taskCB
,
status
,
intSave
);
LOS_Panic
(
"Task delete failed! ERROR : 0x%x
\n
"
,
ret
);
LOS_Panic
(
"Task delete failed! ERROR : 0x%x
\n
"
,
ret
);
return
;
}
}
OsTaskReleaseHoldLock
(
runProcess
,
taskCB
);
OsSchedResched
();
OsSchedResched
();
SCHEDULER_UNLOCK
(
intSave
);
SCHEDULER_UNLOCK
(
intSave
);
return
;
return
;
...
@@ -314,7 +397,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
...
@@ -314,7 +397,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
taskCB
->
joinRetval
=
taskCB
->
taskEntry
(
taskCB
->
args
[
0
],
taskCB
->
args
[
1
],
taskCB
->
joinRetval
=
taskCB
->
taskEntry
(
taskCB
->
args
[
0
],
taskCB
->
args
[
1
],
taskCB
->
args
[
2
],
taskCB
->
args
[
3
]);
/* 2 & 3: just for args array index */
taskCB
->
args
[
2
],
taskCB
->
args
[
3
]);
/* 2 & 3: just for args array index */
if
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_DETACHED
)
{
if
(
!
(
taskCB
->
taskStatus
&
OS_TASK_FLAG_PTHREAD_JOIN
)
)
{
taskCB
->
joinRetval
=
0
;
taskCB
->
joinRetval
=
0
;
}
}
...
@@ -376,62 +459,6 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc(VOID **topStack, UINT32 stack
...
@@ -376,62 +459,6 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc(VOID **topStack, UINT32 stack
*
topStack
=
(
VOID
*
)
LOS_MemAllocAlign
(
pool
,
stackSize
,
LOSCFG_STACK_POINT_ALIGN_SIZE
);
*
topStack
=
(
VOID
*
)
LOS_MemAllocAlign
(
pool
,
stackSize
,
LOSCFG_STACK_POINT_ALIGN_SIZE
);
}
}
STATIC
INLINE
UINT32
OsTaskSyncCreate
(
LosTaskCB
*
taskCB
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32
ret
=
LOS_SemCreate
(
0
,
&
taskCB
->
syncSignal
);
if
(
ret
!=
LOS_OK
)
{
return
LOS_ERRNO_TSK_MP_SYNC_RESOURCE
;
}
#else
(
VOID
)
taskCB
;
#endif
return
LOS_OK
;
}
STATIC
INLINE
VOID
OsTaskSyncDestroy
(
UINT32
syncSignal
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
(
VOID
)
LOS_SemDelete
(
syncSignal
);
#else
(
VOID
)
syncSignal
;
#endif
}
LITE_OS_SEC_TEXT
UINT32
OsTaskSyncWait
(
const
LosTaskCB
*
taskCB
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32
ret
=
LOS_OK
;
LOS_ASSERT
(
LOS_SpinHeld
(
&
g_taskSpin
));
LOS_SpinUnlock
(
&
g_taskSpin
);
/*
* gc soft timer works every OS_MP_GC_PERIOD period, to prevent this timer
* triggered right at the timeout has reached, we set the timeout as double
* of the gc peroid.
*/
if
(
LOS_SemPend
(
taskCB
->
syncSignal
,
OS_MP_GC_PERIOD
*
2
)
!=
LOS_OK
)
{
ret
=
LOS_ERRNO_TSK_MP_SYNC_FAILED
;
}
LOS_SpinLock
(
&
g_taskSpin
);
return
ret
;
#else
(
VOID
)
taskCB
;
return
LOS_OK
;
#endif
}
STATIC
INLINE
VOID
OsTaskSyncWake
(
const
LosTaskCB
*
taskCB
)
{
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
(
VOID
)
OsSemPostUnsafe
(
taskCB
->
syncSignal
,
NULL
);
#else
(
VOID
)
taskCB
;
#endif
}
STATIC
VOID
OsTaskKernelResourcesToFree
(
UINT32
syncSignal
,
UINTPTR
topOfStack
)
STATIC
VOID
OsTaskKernelResourcesToFree
(
UINT32
syncSignal
,
UINTPTR
topOfStack
)
{
{
VOID
*
poolTmp
=
(
VOID
*
)
m_aucSysMem1
;
VOID
*
poolTmp
=
(
VOID
*
)
m_aucSysMem1
;
...
@@ -531,9 +558,7 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
...
@@ -531,9 +558,7 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
#endif
#endif
taskCB
->
policy
=
(
initParam
->
policy
==
LOS_SCHED_FIFO
)
?
LOS_SCHED_FIFO
:
LOS_SCHED_RR
;
taskCB
->
policy
=
(
initParam
->
policy
==
LOS_SCHED_FIFO
)
?
LOS_SCHED_FIFO
:
LOS_SCHED_RR
;
taskCB
->
taskStatus
=
OS_TASK_STATUS_INIT
;
taskCB
->
taskStatus
=
OS_TASK_STATUS_INIT
;
if
(
initParam
->
uwResved
&
OS_TASK_FLAG_DETACHED
)
{
if
(
initParam
->
uwResved
&
LOS_TASK_ATTR_JOINABLE
)
{
taskCB
->
taskStatus
|=
OS_TASK_FLAG_DETACHED
;
}
else
{
taskCB
->
taskStatus
|=
OS_TASK_FLAG_PTHREAD_JOIN
;
taskCB
->
taskStatus
|=
OS_TASK_FLAG_PTHREAD_JOIN
;
LOS_ListInit
(
&
taskCB
->
joinList
);
LOS_ListInit
(
&
taskCB
->
joinList
);
}
}
...
@@ -686,10 +711,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in
...
@@ -686,10 +711,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in
}
else
{
}
else
{
initParam
->
processID
=
OsCurrProcessGet
()
->
processID
;
initParam
->
processID
=
OsCurrProcessGet
()
->
processID
;
}
}
initParam
->
uwResved
&=
~
OS_TASK_FLAG_PTHREAD_JOIN
;
if
(
initParam
->
uwResved
&
LOS_TASK_STATUS_DETACHED
)
{
initParam
->
uwResved
=
OS_TASK_FLAG_DETACHED
;
}
ret
=
LOS_TaskCreateOnly
(
taskID
,
initParam
);
ret
=
LOS_TaskCreateOnly
(
taskID
,
initParam
);
if
(
ret
!=
LOS_OK
)
{
if
(
ret
!=
LOS_OK
)
{
...
@@ -856,31 +877,6 @@ STATIC INLINE VOID OsTaskStatusUnusedSet(LosTaskCB *taskCB)
...
@@ -856,31 +877,6 @@ STATIC INLINE VOID OsTaskStatusUnusedSet(LosTaskCB *taskCB)
OS_MEM_CLEAR
(
taskCB
->
taskID
);
OS_MEM_CLEAR
(
taskCB
->
taskID
);
}
}
STATIC
INLINE
VOID
OsTaskReleaseHoldLock
(
LosProcessCB
*
processCB
,
LosTaskCB
*
taskCB
)
{
LosMux
*
mux
=
NULL
;
UINT32
ret
;
while
(
!
LOS_ListEmpty
(
&
taskCB
->
lockList
))
{
mux
=
LOS_DL_LIST_ENTRY
(
LOS_DL_LIST_FIRST
(
&
taskCB
->
lockList
),
LosMux
,
holdList
);
ret
=
OsMuxUnlockUnsafe
(
taskCB
,
mux
,
NULL
);
if
(
ret
!=
LOS_OK
)
{
LOS_ListDelete
(
&
mux
->
holdList
);
PRINT_ERR
(
"mux ulock failed! : %u
\n
"
,
ret
);
}
}
if
(
processCB
->
processMode
==
OS_USER_MODE
)
{
OsTaskJoinPostUnsafe
(
taskCB
);
#ifdef LOSCFG_KERNEL_VM
OsFutexNodeDeleteFromFutexHash
(
&
taskCB
->
futex
,
TRUE
,
NULL
,
NULL
);
#endif
}
OsTaskSyncWake
(
taskCB
);
}
LITE_OS_SEC_TEXT
VOID
OsRunTaskToDelete
(
LosTaskCB
*
runTask
)
LITE_OS_SEC_TEXT
VOID
OsRunTaskToDelete
(
LosTaskCB
*
runTask
)
{
{
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
runTask
->
processID
);
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
runTask
->
processID
);
...
@@ -1628,6 +1624,104 @@ LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16
...
@@ -1628,6 +1624,104 @@ LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16
return
LOS_OK
;
return
LOS_OK
;
}
}
STATIC
UINT32
OsTaskJoinCheck
(
UINT32
taskID
)
{
if
(
OS_TID_CHECK_INVALID
(
taskID
))
{
return
LOS_EINVAL
;
}
if
(
OS_INT_ACTIVE
)
{
return
LOS_EINTR
;
}
if
(
!
OsPreemptable
())
{
return
LOS_EINVAL
;
}
if
(
taskID
==
OsCurrTaskGet
()
->
taskID
)
{
return
LOS_EDEADLK
;
}
return
LOS_OK
;
}
UINT32
LOS_TaskJoin
(
UINT32
taskID
,
UINTPTR
*
retval
)
{
UINT32
intSave
;
LosTaskCB
*
runTask
=
OsCurrTaskGet
();
LosTaskCB
*
taskCB
=
NULL
;
UINT32
errRet
;
errRet
=
OsTaskJoinCheck
(
taskID
);
if
(
errRet
!=
LOS_OK
)
{
return
errRet
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
LOS_EINVAL
;
}
if
(
runTask
->
processID
!=
taskCB
->
processID
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
LOS_EPERM
;
}
errRet
=
OsTaskJoinPendUnsafe
(
taskCB
);
SCHEDULER_UNLOCK
(
intSave
);
if
(
errRet
==
LOS_OK
)
{
LOS_Schedule
();
if
(
retval
!=
NULL
)
{
*
retval
=
(
UINTPTR
)
taskCB
->
joinRetval
;
}
(
VOID
)
LOS_TaskDelete
(
taskID
);
return
LOS_OK
;
}
return
errRet
;
}
UINT32
LOS_TaskDetach
(
UINT32
taskID
)
{
UINT32
intSave
;
LosTaskCB
*
runTask
=
OsCurrTaskGet
();
LosTaskCB
*
taskCB
=
NULL
;
UINT32
errRet
;
if
(
OS_TID_CHECK_INVALID
(
taskID
))
{
return
LOS_EINVAL
;
}
if
(
OS_INT_ACTIVE
)
{
return
LOS_EINTR
;
}
taskCB
=
OS_TCB_FROM_TID
(
taskID
);
SCHEDULER_LOCK
(
intSave
);
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_UNUSED
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
LOS_EINVAL
;
}
if
(
runTask
->
processID
!=
taskCB
->
processID
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
LOS_EPERM
;
}
if
(
taskCB
->
taskStatus
&
OS_TASK_STATUS_EXIT
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
LOS_TaskJoin
(
taskID
,
NULL
);
}
errRet
=
OsTaskSetDetachUnsafe
(
taskCB
);
SCHEDULER_UNLOCK
(
intSave
);
return
errRet
;
}
LITE_OS_SEC_TEXT
UINT32
LOS_GetSystemTaskMaximum
(
VOID
)
LITE_OS_SEC_TEXT
UINT32
LOS_GetSystemTaskMaximum
(
VOID
)
{
{
return
g_taskMaxNum
;
return
g_taskMaxNum
;
...
...
kernel/base/include/los_task_pri.h
浏览文件 @
2f6cd463
...
@@ -184,14 +184,6 @@ extern SPIN_LOCK_S g_taskSpin;
...
@@ -184,14 +184,6 @@ extern SPIN_LOCK_S g_taskSpin;
*/
*/
#define OS_TASK_FLAG_PTHREAD_JOIN 0x0400U
#define OS_TASK_FLAG_PTHREAD_JOIN 0x0400U
/**
* @ingroup los_task
* Flag that indicates the task or task control block status.
*
* The task is status detached.
*/
#define OS_TASK_FLAG_DETACHED 0x0800U
/**
/**
* @ingroup los_task
* @ingroup los_task
* Flag that indicates the task property.
* Flag that indicates the task property.
...
@@ -533,7 +525,6 @@ extern VOID OsTaskProcSignal(VOID);
...
@@ -533,7 +525,6 @@ extern VOID OsTaskProcSignal(VOID);
extern
UINT32
OsTaskDeleteUnsafe
(
LosTaskCB
*
taskCB
,
UINT32
status
,
UINT32
intSave
);
extern
UINT32
OsTaskDeleteUnsafe
(
LosTaskCB
*
taskCB
,
UINT32
status
,
UINT32
intSave
);
extern
VOID
OsTaskResourcesToFree
(
LosTaskCB
*
taskCB
);
extern
VOID
OsTaskResourcesToFree
(
LosTaskCB
*
taskCB
);
extern
VOID
OsRunTaskToDelete
(
LosTaskCB
*
taskCB
);
extern
VOID
OsRunTaskToDelete
(
LosTaskCB
*
taskCB
);
extern
UINT32
OsTaskSyncWait
(
const
LosTaskCB
*
taskCB
);
extern
UINT32
OsCreateUserTask
(
UINT32
processID
,
TSK_INIT_PARAM_S
*
initParam
);
extern
UINT32
OsCreateUserTask
(
UINT32
processID
,
TSK_INIT_PARAM_S
*
initParam
);
extern
INT32
OsSetTaskName
(
LosTaskCB
*
taskCB
,
const
CHAR
*
name
,
BOOL
setPName
);
extern
INT32
OsSetTaskName
(
LosTaskCB
*
taskCB
,
const
CHAR
*
name
,
BOOL
setPName
);
extern
VOID
OsTaskCBRecycleToFree
(
VOID
);
extern
VOID
OsTaskCBRecycleToFree
(
VOID
);
...
...
kernel/include/los_task.h
浏览文件 @
2f6cd463
...
@@ -59,7 +59,15 @@ extern "C" {
...
@@ -59,7 +59,15 @@ extern "C" {
*
*
* The task is automatically deleted.
* The task is automatically deleted.
*/
*/
#define LOS_TASK_STATUS_DETACHED 0x0800U
#define LOS_TASK_STATUS_DETACHED 0x0U
/**
* @ingroup los_task
* Flag that indicates the task or task control block status.
*
* The task is joinable.
*/
#define LOS_TASK_ATTR_JOINABLE 0x80000000
/**
/**
* @ingroup los_task
* @ingroup los_task
...
@@ -1065,6 +1073,49 @@ extern INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16 priority);
...
@@ -1065,6 +1073,49 @@ extern INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16 priority);
*/
*/
extern
VOID
LOS_Schedule
(
VOID
);
extern
VOID
LOS_Schedule
(
VOID
);
/**
* @ingroup los_task
* @brief Wait for the specified task to finish and reclaim its resources.
*
* @par Description:
* This API is used to wait for the specified task to finish and reclaim its resources.
*
* @attention None.
*
* @param taskID [IN] task ID.
* @param retval [OUT] wait for the return value of the task.
*
* @retval LOS_OK successful
* @retval LOS_EINVAL Invalid parameter or invalid operation
* @retval LOS_EINTR Disallow calls in interrupt handlers
* @retval LOS_EPERM Waiting tasks and calling tasks do not belong to the same process
* @retval LOS_EDEADLK The waiting task is the same as the calling task
* @par Dependency:
* <ul><li>los_task.h: the header file that contains the API declaration.</li></ul>
*/
extern
UINT32
LOS_TaskJoin
(
UINT32
taskID
,
UINTPTR
*
retval
);
/**
* @ingroup los_task
* @brief Change the joinable attribute of the task to detach.
*
* @par Description:
* This API is used to change the joinable attribute of the task to detach.
*
* @attention None.
*
* @param taskID [IN] task ID.
*
* @retval LOS_OK successful
* @retval LOS_EINVAL Invalid parameter or invalid operation
* @retval LOS_EINTR Disallow calls in interrupt handlers
* @retval LOS_EPERM Waiting tasks and calling tasks do not belong to the same process
* @retval LOS_ESRCH Cannot modify the Joinable attribute of a task that is waiting for completion.
* @par Dependency:
* <ul><li>los_task.h: the header file that contains the API declaration.</li></ul>
*/
extern
UINT32
LOS_TaskDetach
(
UINT32
taskID
);
#ifdef __cplusplus
#ifdef __cplusplus
#if __cplusplus
#if __cplusplus
}
}
...
...
syscall/los_syscall.h
浏览文件 @
2f6cd463
...
@@ -106,7 +106,7 @@ extern int SysSetProcessGroupID(unsigned int pid, unsigned int gid);
...
@@ -106,7 +106,7 @@ extern int SysSetProcessGroupID(unsigned int pid, unsigned int gid);
extern
unsigned
int
SysCreateUserThread
(
const
TSK_ENTRY_FUNC
func
,
const
UserTaskParam
*
userParam
,
bool
joinable
);
extern
unsigned
int
SysCreateUserThread
(
const
TSK_ENTRY_FUNC
func
,
const
UserTaskParam
*
userParam
,
bool
joinable
);
extern
int
SysSetThreadArea
(
const
char
*
area
);
extern
int
SysSetThreadArea
(
const
char
*
area
);
extern
char
*
SysGetThreadArea
(
void
);
extern
char
*
SysGetThreadArea
(
void
);
extern
int
SysUserThreadSetDe
at
ch
(
unsigned
int
taskID
);
extern
int
SysUserThreadSetDe
ta
ch
(
unsigned
int
taskID
);
extern
int
SysUserThreadDetach
(
unsigned
int
taskID
);
extern
int
SysUserThreadDetach
(
unsigned
int
taskID
);
extern
int
SysThreadJoin
(
unsigned
int
taskID
);
extern
int
SysThreadJoin
(
unsigned
int
taskID
);
extern
void
SysUserExitGroup
(
int
status
);
extern
void
SysUserExitGroup
(
int
status
);
...
...
syscall/process_syscall.c
浏览文件 @
2f6cd463
...
@@ -883,9 +883,9 @@ unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam
...
@@ -883,9 +883,9 @@ unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam
param
.
pfnTaskEntry
=
func
;
param
.
pfnTaskEntry
=
func
;
if
(
joinable
==
TRUE
)
{
if
(
joinable
==
TRUE
)
{
param
.
uwResved
=
OS_TASK_FLAG_PTHREAD_JOIN
;
param
.
uwResved
=
LOS_TASK_ATTR_JOINABLE
;
}
else
{
}
else
{
param
.
uwResved
=
OS_TASK_FLAG
_DETACHED
;
param
.
uwResved
=
LOS_TASK_STATUS
_DETACHED
;
}
}
return
OsCreateUserTask
(
OS_INVALID_VALUE
,
&
param
);
return
OsCreateUserTask
(
OS_INVALID_VALUE
,
&
param
);
...
@@ -921,7 +921,7 @@ char *SysGetThreadArea(void)
...
@@ -921,7 +921,7 @@ char *SysGetThreadArea(void)
return
(
char
*
)(
OsCurrTaskGet
()
->
userArea
);
return
(
char
*
)(
OsCurrTaskGet
()
->
userArea
);
}
}
int
SysUserThreadSetDe
at
ch
(
unsigned
int
taskID
)
int
SysUserThreadSetDe
ta
ch
(
unsigned
int
taskID
)
{
{
unsigned
int
intSave
;
unsigned
int
intSave
;
int
ret
;
int
ret
;
...
...
syscall/syscall_lookup.h
浏览文件 @
2f6cd463
...
@@ -255,7 +255,7 @@ SYSCALL_HAND_DEF(__NR_shmctl, SysShmCtl, int, ARG_NUM_3)
...
@@ -255,7 +255,7 @@ SYSCALL_HAND_DEF(__NR_shmctl, SysShmCtl, int, ARG_NUM_3)
SYSCALL_HAND_DEF
(
__NR_statx
,
SysStatx
,
int
,
ARG_NUM_5
)
SYSCALL_HAND_DEF
(
__NR_statx
,
SysStatx
,
int
,
ARG_NUM_5
)
/* LiteOS customized syscalls, not compatible with ARM EABI */
/* LiteOS customized syscalls, not compatible with ARM EABI */
SYSCALL_HAND_DEF
(
__NR_pthread_set_detach
,
SysUserThreadSetDe
at
ch
,
int
,
ARG_NUM_1
)
SYSCALL_HAND_DEF
(
__NR_pthread_set_detach
,
SysUserThreadSetDe
ta
ch
,
int
,
ARG_NUM_1
)
SYSCALL_HAND_DEF
(
__NR_pthread_join
,
SysThreadJoin
,
int
,
ARG_NUM_1
)
SYSCALL_HAND_DEF
(
__NR_pthread_join
,
SysThreadJoin
,
int
,
ARG_NUM_1
)
SYSCALL_HAND_DEF
(
__NR_pthread_deatch
,
SysUserThreadDetach
,
int
,
ARG_NUM_1
)
SYSCALL_HAND_DEF
(
__NR_pthread_deatch
,
SysUserThreadDetach
,
int
,
ARG_NUM_1
)
SYSCALL_HAND_DEF
(
__NR_creat_user_thread
,
SysCreateUserThread
,
unsigned
int
,
ARG_NUM_3
)
SYSCALL_HAND_DEF
(
__NR_creat_user_thread
,
SysCreateUserThread
,
unsigned
int
,
ARG_NUM_3
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录