Ejemplo n.º 1
0
/*********************************************************************************************************
** 函数名称: API_TShellGetOption
** 功能描述: 获取新的 shell 选项.
** 输 入  : hTShellHandle   shell 线程
**           pulOpt          shell 选项
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  API_TShellGetOption (LW_OBJECT_HANDLE  hTShellHandle, ULONG  *pulOpt)
{
    PLW_CLASS_TCB   ptcbShell;
    UINT16          usIndex;
    
    if (!pulOpt) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    usIndex = _ObjectGetIndex(hTShellHandle);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(hTShellHandle, _OBJECT_THREAD)) {               /*  检查 ID 类型有效性          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (PX_ERROR);
    }
#endif

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (PX_ERROR);
    }
    
    ptcbShell = __GET_TCB_FROM_INDEX(usIndex);
    *pulOpt   = __TTINY_SHELL_GET_OPT(ptcbShell);
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    return  (ERROR_NONE);
}
Ejemplo n.º 2
0
LW_API  
ULONG  API_TShellSigEvent (LW_OBJECT_HANDLE  ulShell, struct sigevent *psigevent, INT  iSigCode)
{
    REGISTER PLW_CLASS_TCB    ptcbShell;
    REGISTER PLW_CLASS_TCB    ptcbJoin;
             LW_OBJECT_HANDLE ulJoin = LW_OBJECT_HANDLE_INVALID;
             UINT16           usIndex;
    
    usIndex = _ObjectGetIndex(ulShell);
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        return  (ERROR_THREAD_NULL);
    }
    
    ptcbShell = __GET_TCB_FROM_INDEX(usIndex);
    ptcbJoin  = ptcbShell->TCB_ptcbJoin;
    if (ptcbJoin) {                                                     /*  等待其他线程结束            */
        ulJoin = ptcbJoin->TCB_ulId;
    }
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    if (ulJoin) {
        _doSigEvent(ulJoin, psigevent, iSigCode);
    
    } else {
        _doSigEvent(ulShell, psigevent, iSigCode);
    }
    
    return  (ERROR_NONE);
}
Ejemplo n.º 3
0
/*********************************************************************************************************
** 函数名称: sigqueue
** 功能描述: 发送队列类型信号, 如果是进程, 将发送给其主线程.
** 输 入  : ulId                    线程 id 或者 进程号
**           iSigNo                  信号
**           sigvalue                信号 value
** 输 出  : ERROR or OK
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  sigqueue (LW_OBJECT_HANDLE  ulId, INT   iSigNo, const union sigval  sigvalue)
{
    REGISTER UINT16             usIndex;
    REGISTER PLW_CLASS_TCB      ptcb;
             LW_SEND_VAL        sendval;
             
#if LW_CFG_MODULELOADER_EN > 0
    if (ulId < LW_CFG_MAX_THREADS) {                                    /*  进程号                      */
        ulId = vprocMainThread((pid_t)ulId);
    }
#endif                                                                  /*  LW_CFG_MODULELOADER_EN > 0  */
    
    usIndex = _ObjectGetIndex(ulId);
    
    if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) {                        /*  检查 ID 类型有效性          */
        _ErrorHandle(ESRCH);
        return  (PX_ERROR);
    }
    if (_Thread_Index_Invalid(usIndex)) {                               /*  检查线程有效性              */
        _ErrorHandle(ESRCH);
        return  (PX_ERROR);
    }
    
    if (!__issig(iSigNo)) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    if (LW_CPU_GET_CUR_NESTING() || (ulId == API_ThreadIdSelf())) {
        _excJobAdd((VOIDFUNCPTR)sigqueue, (PVOID)ulId, (PVOID)iSigNo, (PVOID)sigvalue.sival_ptr, 
                   0, 0, 0);
        return  (ERROR_NONE);
    }
    
#if LW_CFG_SMP_EN > 0
    if (LW_NCPUS > 1) {                                                 /*  正工作在 SMP 多核模式       */
        if (API_ThreadStop(ulId)) {
            return  (PX_ERROR);
        }
    }
#endif                                                                  /*  LW_CFG_SMP_EN               */

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _ErrorHandle(ESRCH);
        return  (PX_ERROR);
    }
    
    ptcb = __GET_TCB_FROM_INDEX(usIndex);
    if (ptcb->TCB_iDeleteProcStatus) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _ErrorHandle(ERROR_THREAD_OTHER_DELETE);
        return  (PX_ERROR);
    }
    
    sendval = _doSigQueue(ptcb, iSigNo, sigvalue);

#if LW_CFG_SMP_EN > 0
    if (LW_NCPUS > 1) {                                                 /*  正工作在 SMP 多核模式       */
        _ThreadContinue(ptcb, LW_FALSE);                                /*  在内核状态下唤醒被停止线程  */
    }
#endif                                                                  /*  LW_CFG_SMP_EN               */
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
#if LW_CFG_SIGNALFD_EN > 0
    if (sendval == SEND_BLOCK) {
        _sigfdReadUnblock(ulId, iSigNo);
    }
#endif                                                                  /*  LW_CFG_SIGNALFD_EN > 0      */
    
    return  (ERROR_NONE);
}
Ejemplo n.º 4
0
/*********************************************************************************************************
** 函数名称: API_TShellCreateEx
** 功能描述: 创建一个 ttiny shell 系统, SylixOS 支持多个终端设备同时运行.
**           tshell 可以使用标准 tty 设备, 或者 pty 虚拟终端设备.
** 输 入  : iTtyFd                终端设备的文件描述符
**           ulOption              启动参数
**           pfuncRunCallback      初始化完毕后, 启动回调
** 输 出  : shell 线程的句柄.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
LW_OBJECT_HANDLE  API_TShellCreateEx (INT  iTtyFd, ULONG  ulOption, FUNCPTR  pfuncRunCallback)
{
    LW_CLASS_THREADATTR     threadattrTShell;
    LW_OBJECT_HANDLE        hTShellHandle;
    INT                     iKernelFile;
    PLW_CLASS_TCB           ptcbShell;
    
    _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system initialize...\r\n");
    
    if (!isatty(iTtyFd)) {                                              /*  检测是否为终端设备          */
        _DebugHandle(__ERRORMESSAGE_LEVEL,
                     "is not a tty or pty device.\r\n");
        _DebugHandle(__LOGMESSAGE_LEVEL, 
                     "ttniy shell system is not initialize.\r\n");
        return  (0);
    }
    
    API_TShellInit();                                                   /*  初始化 shell                */
    
    if (__PROC_GET_PID_CUR() != 0) {                                    /*  在进程中启动                */
        iKernelFile = dup2kernel(iTtyFd);                               /*  将此文件描述符 dup 到 kernel*/
        if (iKernelFile < 0) {
            return  (0);
        }
        ulOption |= LW_OPTION_TSHELL_CLOSE_FD;                          /*  执行完毕后需要关闭文件      */
        pfuncRunCallback = LW_NULL;                                     /*  进程创建不得安装回调        */
    
    } else {
        iKernelFile = iTtyFd;
    }
    
    API_ThreadAttrBuild(&threadattrTShell,
                        _G_stShellStackSize,                            /*  shell 堆栈大小              */
                        LW_PRIO_T_SHELL,
                        LW_CFG_SHELL_THREAD_OPTION | LW_OPTION_OBJECT_GLOBAL,
                        (PVOID)iKernelFile);                            /*  构建属性块                  */
    
    hTShellHandle = API_ThreadInit("t_tshell", __tshellThread,
                                    &threadattrTShell, LW_NULL);        /*  创建 tshell 线程            */
    if (!hTShellHandle) {
        if (__PROC_GET_PID_CUR() != 0) {                                /*  在进程中启动                */
            __KERNEL_SPACE_ENTER();
            close(iKernelFile);                                         /*  内核中关闭 dup 到内核的文件 */
            __KERNEL_SPACE_EXIT();
        }
        _DebugHandle(__ERRORMESSAGE_LEVEL, 
                     "tshell thread can not create.\r\n");
        _DebugHandle(__LOGMESSAGE_LEVEL, 
                     "ttniy shell system is not initialize.\r\n");
        return  (0);
    }
    
    ptcbShell = __GET_TCB_FROM_INDEX(_ObjectGetIndex(hTShellHandle));
    __TTINY_SHELL_SET_OPT(ptcbShell, ulOption);                         /*  初始化选项                  */
    __TTINY_SHELL_SET_CALLBACK(ptcbShell, pfuncRunCallback);            /*  初始化启动回调              */
    
    API_ThreadStart(hTShellHandle);                                     /*  启动 shell 线程             */
    
    return  (hTShellHandle);
}