	/************** Begin of vosnt.c *******************************************/
	/**********************************************************
	* 版权所有 (C)2001, 深圳市中兴通讯股份有限公司
	*
	* 文件名称： vosnt.c
	* 文件标识：
	* 内容摘要： VOS在WINNT下的实现，包括调度模块、通信模块、
	定时器模块、内存模块,主要实现NT下相应API函
	数的封装
	* 其它说明： 无
	* 当前版本： V 0.1
	* 作    者： 杨新
	* 完成日期： 2002年6月1日
	*
	* 修改记录1：
	*    修改日期：2003年8月20日
	*    版 本 号：V 1.0
	*    修 改 人：王泽民
	*    修改内容：VOS在NT下的适配版本整理,补充一些接口；
	* 修改记录2：…
	*    修改日期：2004年1月2日
	*    版 本 号：V 1.0
	*    修 改 人：谢鑫
	*    修改内容：VOS在NT下的消息队列适配的修改；
	* 修改记录3：…
	*    修改日期：2007年1月20日
	*    版 本 号：V 1.0
	*    修 改 人：jesse
	*    修改内容：增加新的VOS接口；
	**********************************************************/
	/**********************************************************
	* 函数名称： VOS_DeleteSem
	* 功能描述： 删除二进制或计数信号量
	* 输入参数： semId : 信号量标识符
	* 输出参数： 无
	* 返 回 值： VOS_OK       成功
	VOS_ERROR    失败
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/

#include "log4c/vos.h"

#ifdef WIN32
	VOS_STATUS VOS_DeleteSem(SEM_ID semId)
	{
		BOOLEAN status;

		status = CloseHandle(semId);
		if(status != 0)
		{
			return VOS_OK;
		}
		else
		{
			return VOS_ERROR;
		}
	}

	/**********************************************************
	* 函数名称： VOS_GiveSem
	* 功能描述： 释放信号量
	* 输入参数： semId : 信号量标识符
	* 输出参数： 无
	* 返 回 值： VOS_OK       成功
	VOS_ERROR    失败
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	VOS_STATUS VOS_GiveSem(SEM_ID semId)
	{
		BOOLEAN status;

		status = ReleaseSemaphore(semId, 1, NULL);

		if(status != 0)
		{
			return VOS_OK;
		}
		else
		{
			return VOS_ERROR;
		}
	}

	/**********************************************************
	* 函数名称： VOS_TakeSem
	* 功能描述： 获得信号量
	* 输入参数： semId    : 信号量标识符
	timeout  : 超时毫秒数
	* 输出参数： 无
	* 返 回 值： VOS_OK       成功
	VOS_ERROR    失败
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	VOS_STATUS VOS_TakeSem(SEM_ID semId, SWORD32 timeout)
	{
		WORD32 status;
		WORD32 timeLimit;

		if(timeout == -1)
		{
			timeLimit = INFINITE;
		}
		else
		{
			timeLimit = (WORD32)timeout;
		}

		status = WaitForSingleObject(semId, timeLimit);

		if(status == WAIT_OBJECT_0)
		{
			return VOS_OK;
		}
		else
		{
			return VOS_ERROR;
		}
	}

	/**********************************************************
	* 函数名称： VOS_CreateMSem
	* 功能描述： 创建互斥信号量
	* 输入参数： 阻塞任务移出阻塞队列方式
	VOS_SEM_Q_PRIORITY
	VOS_SEM_Q_FIFO
	VOS_SEM_DELETE_SAFE
	VOS_SEM_INVERSION_SAFE
	* 输出参数： 无
	* 返 回 值： MSEM_ID        成功，返回互斥信号量标识符
	NULL           失败，返回NULL
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	SEM_ID VOS_CreateMSem(SWORD32 options)
	{
		SEM_ID semId;

		semId = VOS_CreateBSem(0, (VOS_SEM_STATE)1);

		return semId;
	}

	/**********************************************************
	* 函数名称： VOS_CreateBSem
	* 功能描述： 创建二进制信号量
	* 输入参数： options       : 阻塞任务移出阻塞队列方式
	VOS_SEM_Q_PRIORITY
	VOS_SEM_Q_FIFO
	initialState  : 信号量的初始状态
	VOS_SEM_FULL
	VOS_SEM_EMPTY
	* 输出参数： 无
	* 返 回 值： SEM_ID   成功，返回信号量标识符
	VOS_ERROR    失败，返回NULL
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	SEM_ID VOS_CreateBSem(SWORD32 options, VOS_SEM_STATE initialState)
	{
		HANDLE semId;

		semId = CreateSemaphore(NULL, (int)initialState, 1, NULL);

		return semId;
	}

	/**********************************************************
	* 函数名称： VOS_GetSelfTaskID
	* 功能描述： 获得当前任务ID
	* 输入参数： 无
	* 输出参数： 无
	* 返 回 值： TASK_ID － 任务号
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 03/08/20     V1.0       王泽民      XXXX
	**********************************************************/
	TASK_ID      VOS_GetSelfTaskID(VOID)
	{
		return (TASK_ID)GetCurrentThreadId();
		//return GetCurrentThread();
	}
#else
	/**********************************************************
	* 函数名称： VOS_DeleteSem
	* 功能描述： 删除二进制或计数信号量
	* 输入参数： semId : 信号量标识符
	* 输出参数： 无
	* 返 回 值： VOS_OK       成功
	VOS_ERROR    失败
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX  
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	VOS_STATUS VOS_DeleteSem(SEM_ID semId)
	{
		VOS_STATUS iResult = VOS_OK;
#ifdef PTHREAD
		if (semId != NULL)
		{
			iResult = (VOS_STATUS)sem_destroy(semId);
			free(semId);
		}
#endif

		return iResult;
	}

	/**********************************************************
	* 函数名称： VOS_GiveSem
	* 功能描述： 释放信号量
	* 输入参数： semId : 信号量标识符           
	* 输出参数： 无
	* 返 回 值： VOS_OK       成功
	VOS_ERROR    失败
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX  
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	VOS_STATUS VOS_GiveSem(SEM_ID semId)
	{
#ifdef PTHREAD
		if(sem_post(semId) == 0)
		{
			return VOS_OK;
		}
		else
		{
			return VOS_ERROR;
		}
#else
		return VOS_OK;
#endif
	}

	/**********************************************************
	* 函数名称： VOS_TakeSem
	* 功能描述： 获得信号量
	* 输入参数： semId    : 信号量标识符
	timeout  : 超时毫秒数
	* 输出参数： 无
	* 返 回 值： VOS_OK       成功
	VOS_ERROR    失败
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX  
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	VOS_STATUS VOS_TakeSem(SEM_ID semId, SWORD32 timeout)
	{
#ifdef PTHREAD
		WORD32 timeLimit;

		///printf("VOS_TakeSem begin semId:%u, timeout:%d \n", semId,  timeout);

		if(timeout == VOS_WAIT_FOREVER)
		{
			sem_wait(semId);
			return VOS_OK;
		}
		else if (timeout == 0)
		{
			if(0==sem_trywait(semId))
			{
				return VOS_OK;
			}
			else
			{
				return VOS_ERROR;
			} 
		}
		else
		{
			// use proper timed spinlocks if supported.
			// http://www.opengroup.org/onlinepubs/007904975/functions/sem_timedwait.html
			struct timeval tv;	      
			struct timespec absTime;
			gettimeofday (&tv, 0);
			absTime.tv_sec  = tv.tv_sec + timeout / 1000;
			absTime.tv_nsec = tv.tv_usec * 1000 + (timeout % 1000) * 1000000 ;          

			///printf("VOS_TakeSem semId: %u, absTime.tv_sec:%d absTime.tv_nsec:%d \n", semId, absTime.tv_sec, absTime.tv_nsec);

			if (sem_timedwait(semId, &absTime) == 0)
			{
				printf("VOS_OK \n");
				return VOS_OK;
			}
			else 
			{
				printf("VOS_ERROR \n");
				return VOS_ERROR;
			}

			printf("VOS_TakeSem semId: %u, absTime.tv_sec:%d absTime.tv_nsec:%d \n", semId, absTime.tv_sec, absTime.tv_nsec);
		}
#else
		return VOS_OK;
#endif
	}

	/**********************************************************
	* 函数名称： VOS_CreateMSem
	* 功能描述： 创建互斥信号量
	* 输入参数： 阻塞任务移出阻塞队列方式
	VOS_SEM_Q_PRIORITY
	VOS_SEM_Q_FIFO 
	VOS_SEM_DELETE_SAFE
	VOS_SEM_INVERSION_SAFE
	* 输出参数： 无
	* 返 回 值： MSEM_ID 	成功，返回互斥信号量标识符
	NULL       失败，返回NULL
	* 其它说明： 无
	* 修改日期    版本号     修改人	     修改内容
	* -----------------------------------------------
	* 02/08/01	   V1.0	      杨新	       XXXX
	**********************************************************/
	SEM_ID VOS_CreateMSem(SWORD32 options)
	{
#ifdef PTHREAD
		SEM_ID semId = (SEM_ID)malloc (sizeof(sem_t));

		if ( 0 != sem_init(semId,0,1))
		{
			return NULL;
		}

		return semId;	
#else
		return 1;
#endif
	}


	/**********************************************************
	* 函数名称： VOS_CreateBSem
	* 功能描述： 创建二进制信号量
	* 输入参数： options       : 阻塞任务移出阻塞队列方式
	VOS_SEM_Q_PRIORITY  
	VOS_SEM_Q_FIFO
	initialState  : 信号量的初始状态
	VOS_SEM_FULL
	VOS_SEM_EMPTY
	* 输出参数： 无
	* 返 回 值： SEM_ID   成功，返回信号量标识符
	VOS_ERROR    失败，返回NULL
	* 其它说明： 无
	* 修改日期    版本号     修改人      修改内容
	* -----------------------------------------------
	* 02/08/01     V0.1       杨新        XXXX  
	* 03/08/20     V1.0       王泽民      版本整合
	**********************************************************/
	SEM_ID VOS_CreateBSem(SWORD32 options, VOS_SEM_STATE initialState)
	{
		SEM_ID semId = (SEM_ID)malloc (sizeof(sem_t));

		if ( 0 != sem_init(semId,0,initialState))
		{
			return NULL;
		}

		return semId;
	}

	/**********************************************************
	* 函数名称： VOS_GetSelfTaskID
	* 功能描述： 获得任务ID
	* 输入参数： 无
	* 输出参数： 无
	* 返 回 值： TASK_ID － 任务号
	* 其它说明： 无
	* 修改日期    版本号     修改人	     修改内容
	* -----------------------------------------------
	* 02/11/21	   V1.0	      谢鑫	       XXXX
	**********************************************************/
	TASK_ID    VOS_GetSelfTaskID(VOID)
	{
		TASK_ID  dwID;

		dwID = pthread_self();    

		return dwID;
	}
#endif

/************** End of vosnt.c *******************************************/	