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