1
0

condvar_signal_tc.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-11-20 Shell add test suites
  9. */
  10. #include "common.h"
  11. #include "utest_assert.h"
  12. #include <rtdevice.h>
  13. #include <rtdef.h>
  14. #define STACK_SIZE (0x2000)
  15. static struct rt_mutex _local_mtx;
  16. static struct rt_condvar _local_cv;
  17. static void waker_thr(void *param)
  18. {
  19. int err;
  20. rt_mutex_t mutex = &_local_mtx;
  21. rt_condvar_t cond = &_local_cv;
  22. rt_mutex_take(mutex, RT_WAITING_FOREVER);
  23. err = rt_condvar_signal(cond);
  24. if (err != 0)
  25. {
  26. LOG_E("errno=%d, ret=%d\n", errno, err);
  27. LOG_E("rt_condvar_signal() error");
  28. uassert_false(1);
  29. }
  30. else
  31. {
  32. uassert_false(0);
  33. }
  34. rt_mutex_release(mutex);
  35. return;
  36. }
  37. static void condvar_signal_tc(void)
  38. {
  39. rt_thread_t waker;
  40. rt_mutex_t mutex = &_local_mtx;
  41. rt_condvar_t cond = &_local_cv;
  42. int err;
  43. waker = rt_thread_create("waker", waker_thr, 0, STACK_SIZE, 25, 50);
  44. uassert_not_null(waker);
  45. if (rt_mutex_take(mutex, RT_WAITING_FOREVER) != 0)
  46. {
  47. LOG_E("pthread_mutex_lock() error");
  48. uassert_false(1);
  49. return;
  50. }
  51. else
  52. {
  53. uassert_false(0);
  54. }
  55. rt_thread_startup(waker);
  56. err = rt_condvar_timedwait(cond, mutex, RT_KILLABLE, 100);
  57. if (err != 0)
  58. {
  59. if (err == -EINTR || err == -ETIMEDOUT)
  60. {
  61. puts("wait timed out");
  62. uassert_false(0);
  63. }
  64. else
  65. {
  66. LOG_E("errno=%d, ret=%d\n", errno, err);
  67. LOG_E("pthread_cond_timedwait() error");
  68. uassert_false(1);
  69. }
  70. }
  71. err = rt_mutex_release(mutex);
  72. if (err != 0)
  73. {
  74. LOG_E("errno=%d, ret=%d\n", errno, err);
  75. LOG_E("rt_mutex_release() error");
  76. uassert_false(1);
  77. }
  78. else
  79. {
  80. uassert_false(0);
  81. }
  82. return ;
  83. }
  84. static rt_err_t utest_tc_init(void)
  85. {
  86. if (rt_mutex_init(&_local_mtx, "utest", RT_IPC_FLAG_PRIO) != 0)
  87. {
  88. perror("pthread_mutex_init() error");
  89. uassert_false(1);
  90. return -1;
  91. }
  92. rt_condvar_init(&_local_cv, NULL);
  93. return RT_EOK;
  94. }
  95. static rt_err_t utest_tc_cleanup(void)
  96. {
  97. rt_mutex_detach(&_local_mtx);
  98. rt_condvar_detach(&_local_cv);
  99. return RT_EOK;
  100. }
  101. static void testcase(void)
  102. {
  103. UTEST_UNIT_RUN(condvar_signal_tc);
  104. }
  105. UTEST_TC_EXPORT(testcase, "testcases.ipc.condvar.signal", utest_tc_init, utest_tc_cleanup, 10);