shm.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "shm.h"
  2. #include "log.h"
  3. #include "misc.h"
  4. #include "plt.h"
  5. #define shmgetcmd() (pshm->cmd)
  6. #define ack() pshm->rsp = 0
  7. #define nack() pshm->rsp = -1
  8. static sem_t *SEMSHMPING;
  9. static sem_t *SEMSHMPONG;
  10. static struct shm_t *pshm = NULL;
  11. static const char *pstr_sem_name_ping = "mdl_sem_ping";
  12. static const char *pstr_sem_name_pong = "mdl_sem_pong";
  13. static void *shm_thrd_main(void *thd_param)
  14. {
  15. struct shmparam_t *param = &(pshm->param);
  16. unsigned char *shmbuf = pshm->buf;
  17. int idx;
  18. log_dbg("%s, ++", __func__);
  19. while (1)
  20. {
  21. // wait for cmd
  22. sem_wait(SEMSHMPING);
  23. while (sem_trywait(SEMSHMPING) == 0)
  24. ;
  25. // log_dbg("%s, get cmd:%d", __func__, shmgetcmd());
  26. switch (shmgetcmd())
  27. {
  28. case CMD_STA_FETCH:
  29. misc_gen_datetimestr(MDL.sztime, sizeof(MDL.sztime));
  30. memcpy((void *)shmbuf, (void *)(&MDL), sizeof(struct mdl_t));
  31. ack();
  32. break;
  33. case CMD_CHAN_SET_DBG:
  34. pshm->rsp = chan_set_dbg(param->idx, param->val);
  35. break;
  36. case CMD_CHAN_SET_EN:
  37. pshm->rsp = chan_set_en(param->idx, param->val);
  38. break;
  39. case CMD_CHAN_RESET:
  40. pshm->rsp = chan_reset(param->idx);
  41. break;
  42. default:
  43. log_dbg("unknown cmd:%d\n", shmgetcmd());
  44. break;
  45. }
  46. // log_dbg("%s, cmd:%d done, sem post", __func__, shmgetcmd());
  47. sem_post(SEMSHMPONG);
  48. }
  49. log_dbg("%s, --", __func__);
  50. }
  51. int shm_init(void)
  52. {
  53. int ret = 0;
  54. pthread_t thrd;
  55. int shm_id = -1;
  56. void *shared_memory = NULL;
  57. pthread_mutexattr_t attr;
  58. log_dbg("%s, ++,", __func__);
  59. pthread_mutexattr_init(&attr);
  60. pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
  61. shm_id = shmget((key_t)SHMID, sizeof(struct shm_t), 0666 | IPC_CREAT);
  62. if (shm_id < 0)
  63. {
  64. switch (errno)
  65. {
  66. case EINVAL:
  67. log_dbg("%s shmget fail:EINVAL\n", __func__);
  68. break;
  69. case EEXIST:
  70. log_dbg("%s shmget fail:EEXIST\n", __func__);
  71. break;
  72. case EIDRM:
  73. log_dbg("%s shmget fail:EIDRM\n", __func__);
  74. break;
  75. case ENOSPC:
  76. log_dbg("%s shmget fail:ENOSPC\n", __func__);
  77. break;
  78. case ENOENT:
  79. log_dbg("%s shmget fail:ENOENT\n", __func__);
  80. break;
  81. case EACCES:
  82. log_dbg("%s shmget fail:EACCES\n", __func__);
  83. break;
  84. case ENOMEM:
  85. log_dbg("%s shmget fail:ENOMEM\n", __func__);
  86. break;
  87. default:
  88. log_dbg("%s shmget fail:unknown err\n", __func__);
  89. break;
  90. }
  91. ret = -1;
  92. goto leave;
  93. }
  94. shared_memory = shmat(shm_id, NULL, 0);
  95. if (shared_memory == NULL)
  96. {
  97. ret = -2;
  98. goto leave;
  99. }
  100. pshm = (struct shm_t *)shared_memory;
  101. memset(pshm, 0, sizeof(struct shm_t));
  102. pthread_mutex_init(&pshm->mutex, &attr);
  103. SEMSHMPING = sem_open(pstr_sem_name_ping, O_CREAT | O_EXCL, 0644, 0);
  104. if (SEMSHMPING == SEM_FAILED)
  105. {
  106. switch (errno)
  107. {
  108. case EEXIST:
  109. log_dbg("%s, sem_open semshmping fail,EEXIST, try to open it", __func__);
  110. SEMSHMPING = sem_open(pstr_sem_name_ping, 0, 0644, 0);
  111. if (SEMSHMPING == SEM_FAILED)
  112. {
  113. ret = -3;
  114. goto leave;
  115. }
  116. break;
  117. default:
  118. log_dbg("%s, sem_open semshmping fail,unknown error", __func__);
  119. ret = -4;
  120. goto leave;
  121. break;
  122. }
  123. }
  124. SEMSHMPONG = sem_open(pstr_sem_name_pong, O_CREAT | O_EXCL, 0644, 0);
  125. if (SEMSHMPONG == SEM_FAILED)
  126. {
  127. switch (errno)
  128. {
  129. case EEXIST:
  130. log_dbg("%s, sem_open semshmpong fail,EEXIST, try to open it", __func__);
  131. SEMSHMPONG = sem_open(pstr_sem_name_pong, 0, 0644, 0);
  132. if (SEMSHMPONG == SEM_FAILED)
  133. {
  134. ret = -5;
  135. goto leave;
  136. }
  137. break;
  138. default:
  139. log_dbg("%s, sem_open semshmpong fail,unknown error", __func__);
  140. ret = -6;
  141. goto leave;
  142. break;
  143. }
  144. }
  145. if (pthread_create(&thrd, NULL, shm_thrd_main, NULL) != 0)
  146. {
  147. log_dbg("%s, pthread_create fail", __func__);
  148. ret = -10;
  149. goto leave;
  150. }
  151. // success, print something
  152. // ...
  153. leave:
  154. log_dbg("%s, --, ret:%d", __func__, ret);
  155. return ret;
  156. }