vosnt.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. /************** Begin of vosnt.c *******************************************/
  2. /**********************************************************
  3. * 版权所有 (C)2001, 深圳市中兴通讯股份有限公司
  4. *
  5. * 文件名称: vosnt.c
  6. * 文件标识:
  7. * 内容摘要: VOS在WINNT下的实现,包括调度模块、通信模块、
  8. 定时器模块、内存模块,主要实现NT下相应API函
  9. 数的封装
  10. * 其它说明: 无
  11. * 当前版本: V 0.1
  12. * 作 者: 杨新
  13. * 完成日期: 2002年6月1日
  14. *
  15. * 修改记录1:
  16. * 修改日期:2003年8月20日
  17. * 版 本 号:V 1.0
  18. * 修 改 人:王泽民
  19. * 修改内容:VOS在NT下的适配版本整理,补充一些接口;
  20. * 修改记录2:…
  21. * 修改日期:2004年1月2日
  22. * 版 本 号:V 1.0
  23. * 修 改 人:谢鑫
  24. * 修改内容:VOS在NT下的消息队列适配的修改;
  25. * 修改记录3:…
  26. * 修改日期:2007年1月20日
  27. * 版 本 号:V 1.0
  28. * 修 改 人:jesse
  29. * 修改内容:增加新的VOS接口;
  30. **********************************************************/
  31. /**********************************************************
  32. * 函数名称: VOS_DeleteSem
  33. * 功能描述: 删除二进制或计数信号量
  34. * 输入参数: semId : 信号量标识符
  35. * 输出参数: 无
  36. * 返 回 值: VOS_OK 成功
  37. VOS_ERROR 失败
  38. * 其它说明: 无
  39. * 修改日期 版本号 修改人 修改内容
  40. * -----------------------------------------------
  41. * 02/08/01 V0.1 杨新 XXXX
  42. * 03/08/20 V1.0 王泽民 版本整合
  43. **********************************************************/
  44. #include "log4c/vos.h"
  45. #ifdef WIN32
  46. VOS_STATUS VOS_DeleteSem(SEM_ID semId)
  47. {
  48. BOOLEAN status;
  49. status = CloseHandle(semId);
  50. if(status != 0)
  51. {
  52. return VOS_OK;
  53. }
  54. else
  55. {
  56. return VOS_ERROR;
  57. }
  58. }
  59. /**********************************************************
  60. * 函数名称: VOS_GiveSem
  61. * 功能描述: 释放信号量
  62. * 输入参数: semId : 信号量标识符
  63. * 输出参数: 无
  64. * 返 回 值: VOS_OK 成功
  65. VOS_ERROR 失败
  66. * 其它说明: 无
  67. * 修改日期 版本号 修改人 修改内容
  68. * -----------------------------------------------
  69. * 02/08/01 V0.1 杨新 XXXX
  70. * 03/08/20 V1.0 王泽民 版本整合
  71. **********************************************************/
  72. VOS_STATUS VOS_GiveSem(SEM_ID semId)
  73. {
  74. BOOLEAN status;
  75. status = ReleaseSemaphore(semId, 1, NULL);
  76. if(status != 0)
  77. {
  78. return VOS_OK;
  79. }
  80. else
  81. {
  82. return VOS_ERROR;
  83. }
  84. }
  85. /**********************************************************
  86. * 函数名称: VOS_TakeSem
  87. * 功能描述: 获得信号量
  88. * 输入参数: semId : 信号量标识符
  89. timeout : 超时毫秒数
  90. * 输出参数: 无
  91. * 返 回 值: VOS_OK 成功
  92. VOS_ERROR 失败
  93. * 其它说明: 无
  94. * 修改日期 版本号 修改人 修改内容
  95. * -----------------------------------------------
  96. * 02/08/01 V0.1 杨新 XXXX
  97. * 03/08/20 V1.0 王泽民 版本整合
  98. **********************************************************/
  99. VOS_STATUS VOS_TakeSem(SEM_ID semId, SWORD32 timeout)
  100. {
  101. WORD32 status;
  102. WORD32 timeLimit;
  103. if(timeout == -1)
  104. {
  105. timeLimit = INFINITE;
  106. }
  107. else
  108. {
  109. timeLimit = (WORD32)timeout;
  110. }
  111. status = WaitForSingleObject(semId, timeLimit);
  112. if(status == WAIT_OBJECT_0)
  113. {
  114. return VOS_OK;
  115. }
  116. else
  117. {
  118. return VOS_ERROR;
  119. }
  120. }
  121. /**********************************************************
  122. * 函数名称: VOS_CreateMSem
  123. * 功能描述: 创建互斥信号量
  124. * 输入参数: 阻塞任务移出阻塞队列方式
  125. VOS_SEM_Q_PRIORITY
  126. VOS_SEM_Q_FIFO
  127. VOS_SEM_DELETE_SAFE
  128. VOS_SEM_INVERSION_SAFE
  129. * 输出参数: 无
  130. * 返 回 值: MSEM_ID 成功,返回互斥信号量标识符
  131. NULL 失败,返回NULL
  132. * 其它说明: 无
  133. * 修改日期 版本号 修改人 修改内容
  134. * -----------------------------------------------
  135. * 02/08/01 V0.1 杨新 XXXX
  136. * 03/08/20 V1.0 王泽民 版本整合
  137. **********************************************************/
  138. SEM_ID VOS_CreateMSem(SWORD32 options)
  139. {
  140. SEM_ID semId;
  141. semId = VOS_CreateBSem(0, (VOS_SEM_STATE)1);
  142. return semId;
  143. }
  144. /**********************************************************
  145. * 函数名称: VOS_CreateBSem
  146. * 功能描述: 创建二进制信号量
  147. * 输入参数: options : 阻塞任务移出阻塞队列方式
  148. VOS_SEM_Q_PRIORITY
  149. VOS_SEM_Q_FIFO
  150. initialState : 信号量的初始状态
  151. VOS_SEM_FULL
  152. VOS_SEM_EMPTY
  153. * 输出参数: 无
  154. * 返 回 值: SEM_ID 成功,返回信号量标识符
  155. VOS_ERROR 失败,返回NULL
  156. * 其它说明: 无
  157. * 修改日期 版本号 修改人 修改内容
  158. * -----------------------------------------------
  159. * 02/08/01 V0.1 杨新 XXXX
  160. * 03/08/20 V1.0 王泽民 版本整合
  161. **********************************************************/
  162. SEM_ID VOS_CreateBSem(SWORD32 options, VOS_SEM_STATE initialState)
  163. {
  164. HANDLE semId;
  165. semId = CreateSemaphore(NULL, (int)initialState, 1, NULL);
  166. return semId;
  167. }
  168. /**********************************************************
  169. * 函数名称: VOS_GetSelfTaskID
  170. * 功能描述: 获得当前任务ID
  171. * 输入参数: 无
  172. * 输出参数: 无
  173. * 返 回 值: TASK_ID - 任务号
  174. * 其它说明: 无
  175. * 修改日期 版本号 修改人 修改内容
  176. * -----------------------------------------------
  177. * 03/08/20 V1.0 王泽民 XXXX
  178. **********************************************************/
  179. TASK_ID VOS_GetSelfTaskID(VOID)
  180. {
  181. return (TASK_ID)GetCurrentThreadId();
  182. //return GetCurrentThread();
  183. }
  184. #else
  185. /**********************************************************
  186. * 函数名称: VOS_DeleteSem
  187. * 功能描述: 删除二进制或计数信号量
  188. * 输入参数: semId : 信号量标识符
  189. * 输出参数: 无
  190. * 返 回 值: VOS_OK 成功
  191. VOS_ERROR 失败
  192. * 其它说明: 无
  193. * 修改日期 版本号 修改人 修改内容
  194. * -----------------------------------------------
  195. * 02/08/01 V0.1 杨新 XXXX
  196. * 03/08/20 V1.0 王泽民 版本整合
  197. **********************************************************/
  198. VOS_STATUS VOS_DeleteSem(SEM_ID semId)
  199. {
  200. VOS_STATUS iResult = VOS_OK;
  201. #ifdef PTHREAD
  202. if (semId != NULL)
  203. {
  204. iResult = (VOS_STATUS)sem_destroy(semId);
  205. free(semId);
  206. }
  207. #endif
  208. return iResult;
  209. }
  210. /**********************************************************
  211. * 函数名称: VOS_GiveSem
  212. * 功能描述: 释放信号量
  213. * 输入参数: semId : 信号量标识符
  214. * 输出参数: 无
  215. * 返 回 值: VOS_OK 成功
  216. VOS_ERROR 失败
  217. * 其它说明: 无
  218. * 修改日期 版本号 修改人 修改内容
  219. * -----------------------------------------------
  220. * 02/08/01 V0.1 杨新 XXXX
  221. * 03/08/20 V1.0 王泽民 版本整合
  222. **********************************************************/
  223. VOS_STATUS VOS_GiveSem(SEM_ID semId)
  224. {
  225. #ifdef PTHREAD
  226. if(sem_post(semId) == 0)
  227. {
  228. return VOS_OK;
  229. }
  230. else
  231. {
  232. return VOS_ERROR;
  233. }
  234. #else
  235. return VOS_OK;
  236. #endif
  237. }
  238. /**********************************************************
  239. * 函数名称: VOS_TakeSem
  240. * 功能描述: 获得信号量
  241. * 输入参数: semId : 信号量标识符
  242. timeout : 超时毫秒数
  243. * 输出参数: 无
  244. * 返 回 值: VOS_OK 成功
  245. VOS_ERROR 失败
  246. * 其它说明: 无
  247. * 修改日期 版本号 修改人 修改内容
  248. * -----------------------------------------------
  249. * 02/08/01 V0.1 杨新 XXXX
  250. * 03/08/20 V1.0 王泽民 版本整合
  251. **********************************************************/
  252. VOS_STATUS VOS_TakeSem(SEM_ID semId, SWORD32 timeout)
  253. {
  254. #ifdef PTHREAD
  255. WORD32 timeLimit;
  256. ///printf("VOS_TakeSem begin semId:%u, timeout:%d \n", semId, timeout);
  257. if(timeout == VOS_WAIT_FOREVER)
  258. {
  259. sem_wait(semId);
  260. return VOS_OK;
  261. }
  262. else if (timeout == 0)
  263. {
  264. if(0==sem_trywait(semId))
  265. {
  266. return VOS_OK;
  267. }
  268. else
  269. {
  270. return VOS_ERROR;
  271. }
  272. }
  273. else
  274. {
  275. // use proper timed spinlocks if supported.
  276. // http://www.opengroup.org/onlinepubs/007904975/functions/sem_timedwait.html
  277. struct timeval tv;
  278. struct timespec absTime;
  279. gettimeofday (&tv, 0);
  280. absTime.tv_sec = tv.tv_sec + timeout / 1000;
  281. absTime.tv_nsec = tv.tv_usec * 1000 + (timeout % 1000) * 1000000 ;
  282. ///printf("VOS_TakeSem semId: %u, absTime.tv_sec:%d absTime.tv_nsec:%d \n", semId, absTime.tv_sec, absTime.tv_nsec);
  283. if (sem_timedwait(semId, &absTime) == 0)
  284. {
  285. printf("VOS_OK \n");
  286. return VOS_OK;
  287. }
  288. else
  289. {
  290. printf("VOS_ERROR \n");
  291. return VOS_ERROR;
  292. }
  293. printf("VOS_TakeSem semId: %u, absTime.tv_sec:%d absTime.tv_nsec:%d \n", semId, absTime.tv_sec, absTime.tv_nsec);
  294. }
  295. #else
  296. return VOS_OK;
  297. #endif
  298. }
  299. /**********************************************************
  300. * 函数名称: VOS_CreateMSem
  301. * 功能描述: 创建互斥信号量
  302. * 输入参数: 阻塞任务移出阻塞队列方式
  303. VOS_SEM_Q_PRIORITY
  304. VOS_SEM_Q_FIFO
  305. VOS_SEM_DELETE_SAFE
  306. VOS_SEM_INVERSION_SAFE
  307. * 输出参数: 无
  308. * 返 回 值: MSEM_ID 成功,返回互斥信号量标识符
  309. NULL 失败,返回NULL
  310. * 其它说明: 无
  311. * 修改日期 版本号 修改人 修改内容
  312. * -----------------------------------------------
  313. * 02/08/01 V1.0 杨新 XXXX
  314. **********************************************************/
  315. SEM_ID VOS_CreateMSem(SWORD32 options)
  316. {
  317. #ifdef PTHREAD
  318. SEM_ID semId = (SEM_ID)malloc (sizeof(sem_t));
  319. if ( 0 != sem_init(semId,0,1))
  320. {
  321. return NULL;
  322. }
  323. return semId;
  324. #else
  325. return 1;
  326. #endif
  327. }
  328. /**********************************************************
  329. * 函数名称: VOS_CreateBSem
  330. * 功能描述: 创建二进制信号量
  331. * 输入参数: options : 阻塞任务移出阻塞队列方式
  332. VOS_SEM_Q_PRIORITY
  333. VOS_SEM_Q_FIFO
  334. initialState : 信号量的初始状态
  335. VOS_SEM_FULL
  336. VOS_SEM_EMPTY
  337. * 输出参数: 无
  338. * 返 回 值: SEM_ID 成功,返回信号量标识符
  339. VOS_ERROR 失败,返回NULL
  340. * 其它说明: 无
  341. * 修改日期 版本号 修改人 修改内容
  342. * -----------------------------------------------
  343. * 02/08/01 V0.1 杨新 XXXX
  344. * 03/08/20 V1.0 王泽民 版本整合
  345. **********************************************************/
  346. SEM_ID VOS_CreateBSem(SWORD32 options, VOS_SEM_STATE initialState)
  347. {
  348. SEM_ID semId = (SEM_ID)malloc (sizeof(sem_t));
  349. if ( 0 != sem_init(semId,0,initialState))
  350. {
  351. return NULL;
  352. }
  353. return semId;
  354. }
  355. /**********************************************************
  356. * 函数名称: VOS_GetSelfTaskID
  357. * 功能描述: 获得任务ID
  358. * 输入参数: 无
  359. * 输出参数: 无
  360. * 返 回 值: TASK_ID - 任务号
  361. * 其它说明: 无
  362. * 修改日期 版本号 修改人 修改内容
  363. * -----------------------------------------------
  364. * 02/11/21 V1.0 谢鑫 XXXX
  365. **********************************************************/
  366. TASK_ID VOS_GetSelfTaskID(VOID)
  367. {
  368. TASK_ID dwID;
  369. dwID = pthread_self();
  370. return dwID;
  371. }
  372. #endif
  373. /************** End of vosnt.c *******************************************/