Exemplo n.º 1
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemplo n.º 2
0
/*********************************************************************************************************
** 函数名称: 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           */
}
Exemplo n.º 3
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;
        }
    }
}
Exemplo n.º 4
0
/*********************************************************************************************************
** 函数名称: __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 库               */
}