swsignal.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /************************************************************************
  2. * AUTHOR: NiuJiuRu
  3. * FILENAME: swsignal.c
  4. * DESCRIPTION: 信号量
  5. * NOTE: 主要用于状态通知
  6. * HISTORY:
  7. * 1, [2010-12-17] created by NiuJiuRu
  8. ***********************************************************************/
  9. #include "swapi.h"
  10. #include "swmem.h"
  11. #include "swsignal.h"
  12. /* 创建信号量 */
  13. void *sw_signal_create()
  14. {
  15. sem_t *sem = NULL;
  16. sem = (sem_t *)sw_heap_malloc(sizeof(sem_t));
  17. if(sem)
  18. {
  19. memset(sem, 0, sizeof(sem_t));
  20. sem_init(sem, 0, 0);
  21. }
  22. return sem;
  23. }
  24. /* 销毁信号量 */
  25. void sw_signal_destroy(void *hSignal)
  26. {
  27. sem_t *sem = (sem_t *)hSignal;
  28. sem_destroy(sem);
  29. sw_heap_free(sem);
  30. }
  31. /* 等待信号量, timeout(ms) = -1时表示无限等待 */
  32. int sw_signal_wait(void *hSignal, int timeout)
  33. {
  34. sem_t *sem = (sem_t *)hSignal;
  35. struct timeval tv = { 0 };
  36. struct timespec ts = { 0 };
  37. int ret;
  38. if(timeout < 0)
  39. {
  40. wait_p1:
  41. ret = sem_wait(sem);
  42. if(ret < 0 && errno == EINTR) goto wait_p1;
  43. else return ret;
  44. }
  45. else
  46. {
  47. gettimeofday(&tv, NULL);
  48. ts.tv_sec = tv.tv_sec + timeout/1000;
  49. ts.tv_nsec = tv.tv_usec*1000 + (timeout%1000)*1000*1000;
  50. ts.tv_sec += ts.tv_nsec/(1000*1000*1000);
  51. ts.tv_nsec %= (1000*1000*1000);
  52. wait_p2:
  53. ret = sem_timedwait(sem, &ts);
  54. if(ret < 0 && errno == EINTR) goto wait_p2;
  55. else return ret;
  56. }
  57. }
  58. /* 点亮信号量 */
  59. void sw_signal_give(void *hSignal)
  60. {
  61. sem_t *sem = (sem_t *)hSignal;
  62. sem_post(sem);
  63. }