sem.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <errno.h>
  2. #include <sys/fcntl.h>
  3. #include "sem.h"
  4. int sem_close(sem_t *sem)
  5. {
  6. }
  7. int sem_destroy(sem_t *sem)
  8. {
  9. }
  10. int sem_unlink(const char *name)
  11. {
  12. return EACCES;
  13. }
  14. int sem_getvalue(sem_t *sem, int *sval)
  15. {
  16. RT_ASSERT(sem != RT_NULL);
  17. if (sval) *sval = sem->value;
  18. }
  19. int sem_init(sem_t *sem, int pshared, unsigned int value)
  20. {
  21. RT_ASSERT(sem != RT_NULL);
  22. }
  23. sem_t *sem_open(const char *name, int oflag, ...)
  24. {
  25. rt_sem_t sem;
  26. sem = RT_NULL;
  27. if (oflag == O_CREAT)
  28. {
  29. sem = rt_sem_create(name, 1, RT_IPC_FLAG_FIFO);
  30. if (sem == RT_NULL)
  31. rt_set_errno(ENOSPC);
  32. }
  33. if (oflag == O_EXCL)
  34. {
  35. rt_enter_critical();
  36. /* find semaphore object */
  37. rt_exit_critical();
  38. if (sem == RT_NULL) rt_set_errno(ENOENT);
  39. }
  40. return sem;
  41. }
  42. int sem_post(sem_t *sem)
  43. {
  44. rt_sem_release(sem);
  45. }
  46. int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout)
  47. {
  48. rt_err_t result;
  49. rt_int32_t tick;
  50. if (!sem || !abs_timeout) return EINVAL;
  51. /* calculate os tick */
  52. tick = abs_timeout->tv_sec/RT_TICK_PER_SECOND + (abs_timeout->tv_nsec/1000) * (1000/RT_TICK_PER_SECOND);
  53. result = rt_sem_take(sem, tick);
  54. if (result == -RT_ETIMEOUT) return ETIMEDOUT;
  55. if (result == RT_EOK) return 0;
  56. return EINTR;
  57. }
  58. int sem_trywait(sem_t *sem)
  59. {
  60. rt_err_t result;
  61. if (!sem) return EINVAL;
  62. result = rt_sem_take(sem, RT_WAITING_FOREVER);
  63. if (result == -RT_ETIMEOUT) return EAGAIN;
  64. if (result == RT_EOK) return 0;
  65. return EINTR;
  66. }
  67. int sem_wait(sem_t *sem)
  68. {
  69. rt_err_t result;
  70. result = rt_sem_take(sem, RT_WAITING_FOREVER);
  71. if (result == RT_EOK) return 0;
  72. return EINTR;
  73. }