RyanMqttTestUtile.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "RyanMqttTest.h"
  2. static pthread_spinlock_t spin;
  3. uint32_t destroyCount = 0;
  4. uint32_t randomCount = 0;
  5. uint32_t sendRandomCount = 0;
  6. uint32_t memoryRandomCount = 0;
  7. RyanMqttBool_e isEnableRandomNetworkFault = RyanMqttFalse;
  8. RyanMqttBool_e isEnableRandomMemoryFault = RyanMqttFalse;
  9. void enableRandomNetworkFault(void)
  10. {
  11. RyanMqttTestEnableCritical();
  12. isEnableRandomNetworkFault = RyanMqttTrue;
  13. RyanMqttTestExitCritical();
  14. }
  15. void disableRandomNetworkFault(void)
  16. {
  17. RyanMqttTestEnableCritical();
  18. isEnableRandomNetworkFault = RyanMqttFalse;
  19. RyanMqttTestExitCritical();
  20. }
  21. void toggleRandomNetworkFault(void)
  22. {
  23. RyanMqttTestEnableCritical();
  24. isEnableRandomNetworkFault = !isEnableRandomNetworkFault;
  25. RyanMqttTestExitCritical();
  26. }
  27. void enableRandomMemoryFault(void)
  28. {
  29. RyanMqttTestEnableCritical();
  30. isEnableRandomMemoryFault = RyanMqttTrue;
  31. RyanMqttTestExitCritical();
  32. }
  33. void disableRandomMemoryFault(void)
  34. {
  35. RyanMqttTestEnableCritical();
  36. isEnableRandomMemoryFault = RyanMqttFalse;
  37. RyanMqttTestExitCritical();
  38. }
  39. void toggleRandomMemoryFault(void)
  40. {
  41. RyanMqttTestEnableCritical();
  42. isEnableRandomMemoryFault = !isEnableRandomMemoryFault;
  43. RyanMqttTestExitCritical();
  44. }
  45. uint32_t RyanRand(int32_t min, int32_t max)
  46. {
  47. static uint32_t isSeed = 0;
  48. static uint32_t seedp = 0;
  49. if (isSeed > 1024 || 0 == seedp)
  50. {
  51. seedp = platformUptimeMs();
  52. isSeed = 0;
  53. }
  54. if (min >= max)
  55. {
  56. return min;
  57. }
  58. isSeed++;
  59. return (rand_r(&seedp) % (max - min + 1)) + min;
  60. }
  61. void RyanMqttTestEnableCritical(void)
  62. {
  63. pthread_spin_lock(&spin);
  64. }
  65. void RyanMqttTestExitCritical(void)
  66. {
  67. pthread_spin_unlock(&spin);
  68. }
  69. void printfArrStr(uint8_t *buf, uint32_t len, char *userData)
  70. {
  71. RyanMqttLog_raw("%s len: %d ", userData, len);
  72. for (uint32_t i = 0; i < len; i++)
  73. {
  74. RyanMqttLog_raw("%c", buf[i]);
  75. }
  76. RyanMqttLog_raw("\r\n");
  77. }
  78. void RyanMqttTestUtileInit(void)
  79. {
  80. pthread_spin_init(&spin, PTHREAD_PROCESS_PRIVATE);
  81. // 多线程测试必须设置这个,否则会导致 heap-use-after-free, 原因如下
  82. // 虽然也有办法解决,不过RyanMqtt目标为嵌入式场景,不想引入需要更多资源的逻辑,嵌入式场景目前想不到有这么频繁而且还是本机emqx的场景。
  83. // 用户线程send -> emqx回复报文 -> mqtt线程recv。
  84. // recv线程收到数据后,会释放用户线程send的sendbuf缓冲区。
  85. // 但是在本机部署的emqx并且多核心同时运行,发送的数据量非常大的情况下会出现mqtt线程recv已经收到数据,但是用户线程send函数还没有返回。
  86. cpu_set_t cpuset;
  87. CPU_ZERO(&cpuset);
  88. CPU_SET(0, &cpuset);
  89. pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
  90. sched_setaffinity(0, sizeof(cpu_set_t), &cpuset);
  91. vallocInit();
  92. }
  93. void RyanMqttTestUtileDeInit(void)
  94. {
  95. pthread_spin_destroy(&spin);
  96. }