1
0

mqueue.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "mqueue.h"
  2. #include <stdargs.h>
  3. #include "pthread_internal.h"
  4. int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat,
  5. struct mq_attr *omqstat)
  6. {
  7. rt_set_errno(-RT_ERROR);
  8. return -1;
  9. }
  10. int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat)
  11. {
  12. if ((mqdes == RT_NULL) || mqstat == RT_NULL)
  13. {
  14. rt_set_errno(EBADF);
  15. return -1;
  16. }
  17. mqstat->mq_maxmsg = mqdes->max_msgs;
  18. mqstat->mq_msgsize = mqdes->msg_size;
  19. mqstat->mq_curmsgs = 0;
  20. mqstat->mq_flags = 0;
  21. return 0;
  22. }
  23. mqd_t mq_open(const char *name, int oflag, ...)
  24. {
  25. rt_mq_t mq;
  26. va_list arg;
  27. mode_t mode;
  28. struct mq_attr *attr = RT_NULL;
  29. if (oflag & O_CREAT)
  30. {
  31. va_start(arg, oflag);
  32. mode = (mode_t) va_arg(arg, unsigned int);
  33. attr = (struct mq_attr *) va_arg(arg, struct mq_attr *);
  34. va_end(arg);
  35. mq = rt_mq_create(name, attr->mq_msgsize, attr->mq_maxmsg, RT_IPC_FLAG_FIFO);
  36. if (mq == RT_NULL) /* create failed */
  37. {
  38. rt_set_errno(ENFILE);
  39. return RT_NULL;
  40. }
  41. }
  42. if (oflag & O_EXCL)
  43. {
  44. mq = (rt_mq_t)rt_object_find(name, RT_Object_Class_MessageQueue);
  45. if (mq == RT_NULL) rt_set_errno(ENOSPC);
  46. }
  47. return mq;
  48. }
  49. ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio)
  50. {
  51. rt_err_t result;
  52. if ((mqdes == RT_NULL) || (msg_ptr == RT_NULL))
  53. {
  54. rt_set_errno(EINVAL);
  55. return -1;
  56. }
  57. result = rt_mq_recv(mqdes, msg_ptr, msg_len, RT_WAITING_FOREVER);
  58. if (result == RT_EOK)
  59. return msg_len;
  60. rt_set_errno(EBADF);
  61. return -1;
  62. }
  63. int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio)
  64. {
  65. rt_err_t result;
  66. if ((mqdes == RT_NULL) || (msg_ptr == RT_NULL))
  67. {
  68. rt_set_errno(EINVAL);
  69. return -1;
  70. }
  71. result = rt_mq_send(mqdes, msg_ptr, msg_len);
  72. if (result == RT_EOK)
  73. return 0;
  74. rt_set_errno(EBADF);
  75. return -1;
  76. }
  77. ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len,
  78. unsigned *msg_prio, const struct timespec *abs_timeout)
  79. {
  80. int tick;
  81. rt_err_t result;
  82. if ((mqdes == RT_NULL) || (msg_ptr == RT_NULL))
  83. {
  84. rt_set_errno(EINVAL);
  85. return -1;
  86. }
  87. tick = time_to_tick(abs_timeout);
  88. result = rt_mq_recv(mqdes, msg_ptr, msg_len, tick);
  89. if (result == RT_EOK) return msg_len;
  90. if (result == -RT_ETIMEOUT)
  91. rt_set_errno(ETIMEOUT);
  92. else
  93. rt_set_errno(EBADMSG);
  94. return -1;
  95. }
  96. int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio,
  97. const struct timespec *abs_timeout)
  98. {
  99. /* RT-Thread does not support timed send */
  100. return mq_send(mqdes, msg_ptr, msg_len, msg_prio);
  101. }
  102. int mq_notify(mqd_t mqdes, const struct sigevent *notification)
  103. {
  104. rt_set_errno(-RT_ERROT);
  105. return -1;
  106. }
  107. int mq_close(mqd_t mqdes)
  108. {
  109. return 0;
  110. }
  111. int mq_unlink(const char *name)
  112. {
  113. rt_mq_t mq;
  114. mq = (rt_mq_t)rt_object_find(name, RT_Object_Class_MessageQueue);
  115. if (mq == RT_NULL)
  116. {
  117. rt_set_errno(ENOENT);
  118. return -1;
  119. }
  120. rt_mq_delete(mq);
  121. return 0;
  122. }