/********************************************************************************************************* ** 函数名称: vprocStackAlloc ** 功能描述: 分配 stack ** 输 入 : ptcbNew 新建任务 ** ulOption 任务创建选项 ** stSize 堆栈大小 ** 输 出 : 堆栈 ** 全局变量: ** 调用模块: *********************************************************************************************************/ PVOID vprocStackAlloc (PLW_CLASS_TCB ptcbNew, ULONG ulOption, size_t stSize) { PVOID pvRet; #if (LW_CFG_VMM_EN > 0) && !defined(LW_CFG_CPU_ARCH_PPC) PLW_CLASS_TCB ptcbCur; LW_LD_VPROC *pvproc; LW_TCB_GET_CUR_SAFE(ptcbCur); if (ptcbNew->TCB_iStkLocation == LW_TCB_STK_NONE) { /* 还没有确定堆栈的位置 */ pvproc = __LW_VP_GET_TCB_PROC(ptcbCur); if ((pvproc && !(ulOption & LW_OPTION_OBJECT_GLOBAL)) || (ulOption & LW_OPTION_THREAD_STK_MAIN)) { ptcbNew->TCB_iStkLocation = LW_TCB_STK_VMM; /* 使用 VMM 堆栈 */ } else { ptcbNew->TCB_iStkLocation = LW_TCB_STK_HEAP; /* 使用系统堆栈 */ } } if (ptcbNew->TCB_iStkLocation == LW_TCB_STK_VMM) { pvRet = API_VmmMalloc(stSize); } else #endif /* LW_CFG_VMM_EN > 0 */ { ptcbNew->TCB_iStkLocation = LW_TCB_STK_HEAP; pvRet = __KHEAP_ALLOC(stSize); } return (pvRet); }
/********************************************************************************************************* ** 函数名称: vprocStackFree ** 功能描述: 释放 stack ** 输 入 : ptcbDel 被删除的任务 ** pvStack 线程堆栈 ** bImmed 立即回收 ** 输 出 : 堆栈 ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID vprocStackFree (PLW_CLASS_TCB ptcbDel, PVOID pvStack, BOOL bImmed) { #if (LW_CFG_VMM_EN > 0) && !defined(LW_CFG_CPU_ARCH_PPC) LW_LD_VPROC *pvproc; BOOL bFree = LW_TRUE; switch (ptcbDel->TCB_iStkLocation) { case LW_TCB_STK_VMM: pvproc = __LW_VP_GET_TCB_PROC(ptcbDel); if (pvproc && (pvproc->VP_ulMainThread == ptcbDel->TCB_ulId)) { /* 如果是主线程 */ if (bImmed) { #if LW_CFG_COROUTINE_EN > 0 if (pvproc->VP_pvMainStack == pvStack) { pvproc->VP_pvMainStack = LW_NULL; /* 主线程堆栈删除 */ } #else pvproc->VP_pvMainStack = LW_NULL; #endif /* LW_CFG_COROUTINE_EN > 0 */ } else { bFree = LW_FALSE; /* 延迟删除主线程堆栈 */ } } if (bFree) { API_VmmFree(pvStack); } break; case LW_TCB_STK_HEAP: __KHEAP_FREE(pvStack); break; default: _BugHandle(LW_TRUE, LW_FALSE, "unknown stack property!\r\n"); break; } #else __KHEAP_FREE(pvStack); #endif /* LW_CFG_VMM_EN > 0 */ }
/********************************************************************************************************* ** 函数名称: __sprio_hook ** 功能描述: set or set the nice value ** 输 入 : ret return value ** which PRIO_PROCESS / PRIO_PGRP / PRIO_USER ** who process ID / process group ID / effective user ID ** pucPriority sylixos priority ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static void __sprio_hook (PLW_CLASS_TCB ptcb, int *ret, int which, id_t who, UINT8 *pucPriority) { LW_LD_VPROC *pvproc = __LW_VP_GET_TCB_PROC(ptcb); if (pvproc) { switch (which) { case PRIO_PROCESS: if (pvproc->VP_pid == (pid_t)who) { if (!LW_PRIO_IS_EQU(*pucPriority, ptcb->TCB_ucPriority)) { _SchedSetPrio(ptcb, *pucPriority); } *ret = ERROR_NONE; } break; case PRIO_PGRP: if (pvproc->VP_pidGroup == (pid_t)who) { if (!LW_PRIO_IS_EQU(*pucPriority, ptcb->TCB_ucPriority)) { _SchedSetPrio(ptcb, *pucPriority); } *ret = ERROR_NONE; } break; case PRIO_USER: if (ptcb->TCB_euid == (uid_t)who) { if (!LW_PRIO_IS_EQU(*pucPriority, ptcb->TCB_ucPriority)) { _SchedSetPrio(ptcb, *pucPriority); } *ret = ERROR_NONE; } break; } } }
/********************************************************************************************************* ** 函数名称: __pthreadDataDeleteByThread ** 功能描述: 删除所有与当前线程相关的内部数据节点. ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID __pthreadDataDeleteByThread (LW_OBJECT_HANDLE ulId, PVOID pvRetVal, PLW_CLASS_TCB ptcbDel) { __PX_KEY_NODE *pkeyn; __PX_KEY_DATA *pkeyd; LW_OBJECT_HANDLE ulMe = ptcbDel->TCB_ulId; __PX_CONTEXT *pctx = _posixCtxTryGet(ptcbDel); /* 不存在则不创建 */ PLW_LIST_LINE plineTempK; PLW_LIST_LINE plineTempD; PVOID pvPrevValue; BOOL bCall = LW_TRUE; #if LW_CFG_MODULELOADER_EN > 0 LW_LD_VPROC *pvprocDel; #endif /* LW_CFG_MODULELOADER_EN */ if (pctx == LW_NULL) { /* 不是 posix 线程 */ return; } #if LW_CFG_MODULELOADER_EN > 0 pvprocDel = __LW_VP_GET_TCB_PROC(ptcbDel); if (pvprocDel && pvprocDel->VP_bForceTerm) { /* 进程不需要执行 destructor */ bCall = LW_FALSE; } #endif /* LW_CFG_MODULELOADER_EN */ /* * 线程删除, 需要遍历所有 key 键的私有数据表, 删除与本线程相关的私有数据 */ __re_check: __PX_LOCK(); /* 锁住 posix 库 */ for (plineTempK = _G_plineKeyHeader; plineTempK != LW_NULL; plineTempK = _list_line_get_next(plineTempK)) { /* 遍历所有 key 键 */ pkeyn = (__PX_KEY_NODE *)plineTempK; plineTempD = pkeyn->PKEYN_plineKeyHeader; /* 遍历 key 键内的所有节点 */ while (plineTempD) { pkeyd = (__PX_KEY_DATA *)plineTempD; plineTempD = _list_line_get_next(plineTempD); if (pkeyd->PKEYD_ulOwner == ulMe) { /* 是否为当前线程数据节点 */ if (pkeyd->PKEYD_pvData) { /* 需要调用 destructor */ pvPrevValue = pkeyd->PKEYD_pvData; pkeyd->PKEYD_pvData = LW_NULL; /* 下次不再调用 destructor */ __PX_UNLOCK(); /* 解锁 posix 库 */ if (pkeyn->PKEYN_pfuncDestructor && bCall) { /* 调用删除函数 */ LW_SOFUNC_PREPARE(pkeyn->PKEYN_pfuncDestructor); pkeyn->PKEYN_pfuncDestructor(pvPrevValue); } goto __re_check; /* 重新检查 */ } _List_Line_Del(&pkeyd->PKEYD_lineManage, &pkeyn->PKEYN_plineKeyHeader); /* 从链表中删除 */ __SHEAP_FREE(pkeyd); /* 释放线程私有数据内存 */ } } } __PX_UNLOCK(); /* 解锁 posix 库 */ }