test-mutex.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "ktest_utils.h"
  2. #include <common/mutex.h>
  3. #include <common/time.h>
  4. #include <common/sys/wait.h>
  5. #include <process/process.h>
  6. static mutex_t mtx;
  7. /**
  8. * @brief 测试是否能够加锁
  9. *
  10. * @param arg0
  11. * @param arg1
  12. * @return long
  13. */
  14. static long ktest_mutex_case0(uint64_t arg0, uint64_t arg1)
  15. {
  16. assert(mutex_is_locked(&mtx) == 0);
  17. mutex_lock(&mtx);
  18. assert(mutex_is_locked(&mtx) == 1);
  19. mutex_unlock(&mtx);
  20. assert(mutex_is_locked(&mtx) == 0);
  21. assert(mutex_trylock(&mtx) == 1);
  22. mutex_unlock(&mtx);
  23. assert(mutex_is_locked(&mtx) == 0);
  24. }
  25. /**
  26. * @brief 测试用例1的辅助线程
  27. *
  28. * @param arg
  29. * @return long
  30. */
  31. static int ktest_mutex_case1_pid1(void* arg)
  32. {
  33. kTEST("ktest_mutex_case1_subproc start.");
  34. assert(mutex_is_locked(&mtx) == 1);
  35. mutex_lock(&mtx);
  36. assert(atomic_read(&mtx.count) == 0);
  37. assert(list_empty(&mtx.wait_list));
  38. mutex_unlock(&mtx);
  39. kTEST("ktest_mutex_case1_subproc exit.");
  40. return 0;
  41. }
  42. static long ktest_mutex_case1(uint64_t arg0, uint64_t arg1)
  43. {
  44. if (!assert(mutex_is_locked(&mtx) == 0))
  45. goto failed;
  46. // 加锁
  47. mutex_lock(&mtx);
  48. // 启动另一个线程
  49. pid_t pid = kernel_thread(ktest_mutex_case1_pid1, 0, 0);
  50. // 等待100ms
  51. usleep(100000);
  52. while (list_empty(&mtx.wait_list))
  53. ;
  54. // 当子线程加锁后,计数应当为0
  55. assert(atomic_read(&mtx.count) == 0);
  56. struct mutex_waiter_t *wt = container_of(list_next(&mtx.wait_list), struct mutex_waiter_t, list);
  57. assert(wt->pcb->pid == pid);
  58. mutex_unlock(&mtx);
  59. int stat = 1;
  60. waitpid(pid, &stat, 0);
  61. assert(stat == 0);
  62. return 0;
  63. failed:;
  64. kTEST("mutex test case1 failed.");
  65. return -1;
  66. }
  67. static ktest_case_table kt_mutex_func_table[] = {
  68. ktest_mutex_case0,
  69. ktest_mutex_case1,
  70. };
  71. int ktest_test_mutex(void* arg)
  72. {
  73. kTEST("Testing mutex...");
  74. mutex_init(&mtx);
  75. for (int i = 0; i < sizeof(kt_mutex_func_table) / sizeof(ktest_case_table); ++i)
  76. {
  77. kTEST("Testing case %d", i);
  78. kt_mutex_func_table[i](i, 0);
  79. }
  80. kTEST("mutex Test done.");
  81. return 0;
  82. }