74 if (OS_TID_CHECK_INVALID(
id)) {
80 if ((data->
state == PTHREAD_STATE_FREE) || (data->
state == PTHREAD_STATE_EXITED)) {
102 if (self->canceled && (self->cancelstate == PTHREAD_CANCEL_ENABLE)) {
110 data->
state = PTHREAD_STATE_FREE;
130 if (data->
state == PTHREAD_STATE_EXITED) {
150 (VOID)memcpy_s(outAttr,
sizeof(pthread_attr_t), attr,
sizeof(pthread_attr_t));
157 if (!outAttr->stacksize_set) {
158 outAttr->stacksize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
160 if (outAttr->inheritsched == PTHREAD_INHERIT_SCHED) {
161 if (self->task == NULL) {
164 outAttr->schedpolicy =
self->attr.schedpolicy;
165 outAttr->schedparam =
self->attr.schedparam;
166 outAttr->scope =
self->attr.scope;
174 created->
attr = *userAttr;
175 created->
id = threadID;
176 created->
task = taskCB;
177 created->
state = (userAttr->detachstate == PTHREAD_CREATE_JOINABLE) ?
178 PTHREAD_STATE_RUNNING : PTHREAD_STATE_DETACHED;
181 created->
canceltype = PTHREAD_CANCEL_DEFERRED;
190 const CHAR name[],
size_t len)
194 LosTaskCB *taskCB = OS_TCB_FROM_TID(threadID);
197 err = strncpy_s(created->
name,
sizeof(created->
name), name, len);
199 PRINT_ERR(
"%s: %d, err: %d\n", __FUNCTION__, __LINE__, err);
205 PRINT_ERR(
"%s: %d, err: %d\n", __FUNCTION__, __LINE__, err);
208#ifdef LOSCFG_KERNEL_SMP
209 if (userAttr->cpuset.__bits[0] > 0) {
230 void *(*startRoutine)(
void *),
void *arg)
232 pthread_attr_t userAttr;
234 CHAR name[PTHREAD_DATA_NAME_MAX] = {0};
235 STATIC
UINT16 pthreadNumber = 1;
240 if ((thread == NULL) || (startRoutine == NULL)) {
246 (VOID)snprintf_s(name,
sizeof(name),
sizeof(name) - 1,
"pth%02d", pthreadNumber);
249 taskInitParam.
pcName = name;
259 if (userAttr.detachstate == PTHREAD_CREATE_DETACHED) {
260 taskInitParam.
uwResved = LOS_TASK_STATUS_DETACHED;
263 taskInitParam.
uwResved = LOS_TASK_ATTR_JOINABLE;
269 *thread = (pthread_t)taskHandle;
270 ret =
InitPthreadData(*thread, &userAttr, name, PTHREAD_DATA_NAME_MAX);
272 goto ERROR_OUT_WITH_TASK;
286 *thread = (pthread_t)-1;
297 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
301 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
304 self->task->joinRetval = retVal;
309 if (self->state == PTHREAD_STATE_DETACHED) {
310 self->state = PTHREAD_STATE_EXITED;
313 self->state = PTHREAD_STATE_JOIN;
317 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
319 SCHEDULER_LOCK(intSave);
322 if (self->task->taskStatus & OS_TASK_STATUS_RUNNING) {
325 SCHEDULER_UNLOCK(intSave);
333 switch (joined->
state) {
334 case PTHREAD_STATE_RUNNING:
336 SCHEDULER_LOCK(intSave);
338 SCHEDULER_UNLOCK(intSave);
344 joined->
state = PTHREAD_STATE_ALRDY_JOIN;
350 case PTHREAD_STATE_FREE:
351 case PTHREAD_STATE_DETACHED:
352 case PTHREAD_STATE_EXITED:
356 case PTHREAD_STATE_ALRDY_JOIN:
359 case PTHREAD_STATE_JOIN:
362 PRINT_ERR(
"state: %u is not supported\n", (
UINT32)joined->
state);
385 if (joined == NULL) {
388 status = joined->
state;
390 if (joined ==
self) {
402 if (retVal != NULL) {
408 joined->
state = PTHREAD_STATE_EXITED;
414 joined->
state = status;
441 if (detached == NULL) {
443 }
else if (detached->
state == PTHREAD_STATE_DETACHED) {
445 }
else if (detached->
state == PTHREAD_STATE_JOIN) {
446 detached->
state = PTHREAD_STATE_EXITED;
450 SCHEDULER_LOCK(intSave);
455 }
else if (ret == LOS_OK) {
456 detached->
state = PTHREAD_STATE_DETACHED;
459 detached->
state = PTHREAD_STATE_EXITED;
462 SCHEDULER_UNLOCK(intSave);
479 if ((param == NULL) || (param->sched_priority > OS_TASK_PRIORITY_LOWEST)) {
483 if (policy != SCHED_RR) {
503 data->
attr.schedpolicy = SCHED_RR;
504 data->
attr.schedparam = *param;
520 if ((policy == NULL) || (param == NULL)) {
534 *policy = data->
attr.schedpolicy;
535 *param = data->
attr.schedparam;
548int pthread_once(pthread_once_t *onceControl,
void (*initRoutine)(
void))
553 if ((onceControl == NULL) || (initRoutine == NULL)) {
583 PRINT_ERR(
"[%s] is not support.\n", __FUNCTION__);
592 PRINT_ERR(
"[%s] is not support.\n", __FUNCTION__);
600 PRINT_ERR(
"[%s] is not support.\n", __FUNCTION__);
613 if ((state != PTHREAD_CANCEL_ENABLE) && (state != PTHREAD_CANCEL_DISABLE)) {
624 if (oldState != NULL) {
625 *oldState =
self->cancelstate;
628 self->cancelstate = (
UINT8)state;
647 if ((type != PTHREAD_CANCEL_ASYNCHRONOUS) && (type != PTHREAD_CANCEL_DEFERRED)) {
657 if (oldType != NULL) {
658 *oldType =
self->canceltype;
661 self->canceltype = (
UINT8)type;
683 SCHEDULER_LOCK(intSave);
685 SCHEDULER_UNLOCK(intSave);
689 data->
state = PTHREAD_STATE_EXITED;
705 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
711 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
718 if ((data->
cancelstate == PTHREAD_CANCEL_ENABLE) &&
719 (data->
canceltype == PTHREAD_CANCEL_ASYNCHRONOUS)) {
735 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
741 PRINT_ERR(
"%s: %d failed\n", __FUNCTION__, __LINE__);
774 return thread1 == thread2;
778 void (*routine)(
void *),
void *arg)
783 PRINT_ERR(
"[%s] is not support.\n", __FUNCTION__);
791 PRINT_ERR(
"[%s] is not support.\n", __FUNCTION__);
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
Unlock the task scheduling.
LITE_OS_SEC_BSS UINT32 g_taskMaxNum
任务最大数量 默认128个
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
Delete a task.
LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskID)
获取任务的优先级
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
设置指定任务的优先级
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S *initParam)
LOS_TaskCreateOnly 创建任务,并使该任务进入suspend状态,不对该任务进行调度。如果需要调度,可以调用LOS_TaskResume使该任务进入ready状态
LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16 priority)
Set the scheduling policy and priority for the task.
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID)
外部接口,对OsTaskSuspend的封装
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID)
Lock the task scheduling.
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
LITE_OS_SEC_TEXT UINT32 OsGetKernelInitProcessID(VOID)
获取内核态根进程
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
VOID OsSchedResched(VOID)
LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
挂起任务,任务进入等待链表,Join代表是支持通过一个任务去唤醒其他的任务
LITE_OS_SEC_TEXT INT32 OsSetTaskName(LosTaskCB *taskCB, const CHAR *name, BOOL setPName)
LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
OsTaskJoinPostUnsafe 查找task 通过 OS_TCB_FROM_PENDLIST 来完成,相当于由LOS_DL_LIST找到LosTaskCB,...
LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
任务设置分离模式 Deatch和JOIN是一对有你没我的状态
int map_errno(UINT32 err)
_pthread_data * pthread_get_self_data(void)
int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param)
设置调度参数
STATIC _pthread_data g_pthreadData[LOSCFG_BASE_CORE_TSK_LIMIT+1]
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset)
STATIC INT32 CheckForCancel(VOID)
void pthread_exit(void *retVal)
线程退出
STATIC INT32 g_pthreadsExited
UINTPTR g_pthreadCanceledDummyVar
int pthread_setcanceltype(int type, int *oldType)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*startRoutine)(void *), void *arg)
pthread_create 创建线程
STATIC UINT32 InitPthreadData(pthread_t threadID, pthread_attr_t *userAttr, const CHAR name[], size_t len)
线程控制块初始化
pthread_t pthread_self(void)
STATIC VOID SetPthreadDataAttr(const pthread_attr_t *userAttr, const pthread_t threadID, LosTaskCB *taskCB, _pthread_data *created)
int pthread_equal(pthread_t thread1, pthread_t thread2)
_pthread_data * pthread_get_data(pthread_t id)
获取线程控制块
STATIC VOID PthreadReap(VOID)
int pthread_detach(pthread_t thread)
int pthread_once(pthread_once_t *onceControl, void(*initRoutine)(void))
STATIC VOID SetPthreadAttr(const _pthread_data *self, const pthread_attr_t *attr, pthread_attr_t *outAttr)
设置线程的属性
STATIC INT32 ProcessByJoinState(_pthread_data *joined)
int pthread_cancel(pthread_t thread)
int pthread_getschedparam(pthread_t thread, int *policy, struct sched_param *param)
STATIC pthread_mutex_t g_pthreadsDataMutex
int pthread_setcancelstate(int state, int *oldState)
void pthread_cleanup_push_inner(struct pthread_cleanup_buffer *buffer, void(*routine)(void *), void *arg)
void pthread_cleanup_pop_inner(struct pthread_cleanup_buffer *buffer, int execute)
int pthread_setspecific(pthread_key_t key, const void *pointer)
void * pthread_getspecific(pthread_key_t key)
STATIC UINT32 DoPthreadCancel(_pthread_data *data)
int pthread_join(pthread_t thread, void **retVal)
void pthread_testcancel(void)
int pthread_key_create(pthread_key_t *key, void(*destructor)(void *))
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset)
STATIC VOID ProcessUnusedStatusTask(_pthread_data *data)
int pthread_attr_init(pthread_attr_t *attr)
int pthread_mutex_lock(pthread_mutex_t *mutex)
互斥锁加锁操作
int pthread_mutex_unlock(pthread_mutex_t *mutex)
解锁互斥锁
int sched_getaffinity(pid_t pid, size_t set_size, cpu_set_t *set)
int sched_setaffinity(pid_t pid, size_t set_size, const cpu_set_t *set)
CHAR name[PTHREAD_DATA_NAME_MAX]
struct pthread_cleanup_buffer * cancelbuffer
volatile UINT8 canceltype
TSK_ENTRY_FUNC pfnTaskEntry