/**
* @file CM_MultiThread.h
* @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>
*/
#ifndef CM_MULTITHREAD_H
#define CM_MULTITHREAD_H

#include "CM_MultiThread_Priority.h"

#ifdef WIN32
#include <process.h>
#endif

#ifdef VXWORKS
#include <taskLib.h>
#endif

#ifdef QNX
#include <pthread.h>
#include <sched.h>
#endif

#ifdef __cplusplus
extern "C"
{
#endif /**< __cplusplus */


    /** 线程函数原型定义 */
#define CM_THREAD_RETRUN static CM_THREAD_FUNC_RETURN CM_THREAD_CALL



    /** 任务入口参数结构体  */
    typedef struct
    {
        int args0; /**< 参数0 */
        int args1; /**< 参数1 */
        int args2; /**< 参数2 */
        int args3; /**< 参数3 */
        int args4; /**< 参数4 */
        int args5; /**< 参数5 */
        int args6; /**< 参数6 */
        int args7; /**< 参数7 */
        int args8; /**< 参数8 */
        int args9; /**< 参数9 */
    }CM_Thread_Arg_Struct_T;

    /**
    * @brief CM_Thread_Create
    * @details 创建线程
    * @param[out] thread 线程句柄(若为NULL则不输出线程句柄)
    * @param[in] myfunc 线程函数
    * @param[in] threadName 线程名(仅VxWorks用到)
    * @param[in] stackSize 线程堆栈大小(VxWorks和Windows可用)
    * @param[in] priority 优先级(VxWorks和Windows可用) CM_TASK_PRIORITY_0 到 CM_TASK_PRIORITY_99
    * @param[in] args 参数
    * @return CM_BOOL
    */
    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);

    /**
    * @brief CM_Thread_Self
    * @details 返回当前线程ID
    * @return CM_THREAD_T
    */
    CM_THREAD_T CM_Thread_Self(void);

#ifdef __cplusplus
}

#endif /**< __cplusplus */

#endif /**< _CM_MULTITHREAD_H */

