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