/************** 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 *******************************************/	