/**
* @file CM_MultiThread.c
* @brief 实现了线程操作的的封装
* @author GT-BU
* @date 2021.02.01
* @version V1.1
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2017.12.20  <td>V1.0     <td>MSCP项目组 <td>创建初始版本
* <tr><td>2021.02.01  <td>V1.1     <td>GT-BU      <td>TSCP项目集成、更新
* </table>
*/
#include "CM_MultiThread.h"

#ifdef QNX
/*
* @brief 创建线程
* @param thread 线程ID
* @param myfunc 线程执行函数
* @param threadName 线程名称
* @param stackSize 线程堆栈大小
* @param priority 线程优先级
* @param pargs 线程输入参数
* @return 执行结果
* - CM_TRUE 成功
* - CM_FALSE 失败
*/
CM_BOOL CM_Thread_Create(OUT CM_THREAD_T* thread, IN CM_THREAD_FUNC_T myfunc, IN const CM_CHAR* threadName, IN CM_INT32 stackSize, IN CM_INT32 priority, IN CM_Thread_Arg_Struct_T* args)
{
    /*- 变量初始化 */
    CM_THREAD_T tmpThread = 0;      /* 线程ID */
    CM_THREAD_T rt = -1;            /* 函数返回值 */
    pthread_attr_t attr = { 0 };  /* 线程属性 */
    struct sched_param params;    /* 线程调度参数 */
    /*- 输入参数是否合法 */
    if ((priority <= CM_TASK_PRIORITY_1) && (priority >= CM_TASK_PRIORITY_99) && (stackSize >= 0))
    {
        /*- 配置线程属性 */
        (void)pthread_attr_init(&attr);
        rt = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
        /*- 是否成功配置线程属性 */
        if (rt == 0)
        {
            /*- 设置线程优先级 */
            params.sched_priority = priority;
            rt = pthread_attr_setschedparam(&attr, &params);
            /*- 是否成功设置线程优先级 */
            if (rt == 0)
            {
                /*- @alias 设置线程堆栈 */
                if (stackSize > 0)
                {
                    rt = pthread_attr_setstacksize(&attr, (size_t)stackSize);
                }
                else
        		{
        			/* 无处理 */
        		}
                /*- 是否成功设置线程堆栈*/
                if (rt == 0)
                {
                    /*- @alias 创建线程 */
                    if (NULL == thread)
                    {
                        rt = pthread_create(&tmpThread, &attr, (CM_THREAD_FUNC_T)myfunc, args);
                        (void)pthread_setname_np(tmpThread, threadName);
                    }
                    else
                    {
                        rt = pthread_create(thread, &attr, (CM_THREAD_FUNC_T)myfunc, args);
                        (void)pthread_setname_np(*thread, threadName);
                    }
                }
                else
        		{
        			/*- 无处理 */
        		}
            }
            else
    		{
    			/*- 无处理 */
    		}
        }
        else
		{
			/*- 无处理 */
		}
        (void)pthread_attr_destroy(&attr);
    }
    else
	{
		/*- 无处理 */
	}

    /*- @alias 判断执行结果 */
    if (0 == rt)
    {
        rt = CM_TRUE;
    }
    else
    {
        rt = CM_FALSE;
    }
    /*- 返回执行结果 */
    return rt;
}
/*
* @brief 获取当前线程ID
* @return 线程ID
*/
CM_THREAD_T CM_Thread_Self(void)
{
    /*- 获取当前线程ID */
    CM_THREAD_T rt = pthread_self();
    /*- 返回线程ID */
    return rt;
}
#endif 



