membarrier_test_multi_thread.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-License-Identifier: GPL-2.0
  2. #define _GNU_SOURCE
  3. #include <linux/membarrier.h>
  4. #include <syscall.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <pthread.h>
  9. #include "membarrier_test_impl.h"
  10. static int thread_ready, thread_quit;
  11. static pthread_mutex_t test_membarrier_thread_mutex =
  12. PTHREAD_MUTEX_INITIALIZER;
  13. static pthread_cond_t test_membarrier_thread_cond =
  14. PTHREAD_COND_INITIALIZER;
  15. void *test_membarrier_thread(void *arg)
  16. {
  17. pthread_mutex_lock(&test_membarrier_thread_mutex);
  18. thread_ready = 1;
  19. pthread_cond_broadcast(&test_membarrier_thread_cond);
  20. pthread_mutex_unlock(&test_membarrier_thread_mutex);
  21. pthread_mutex_lock(&test_membarrier_thread_mutex);
  22. while (!thread_quit)
  23. pthread_cond_wait(&test_membarrier_thread_cond,
  24. &test_membarrier_thread_mutex);
  25. pthread_mutex_unlock(&test_membarrier_thread_mutex);
  26. return NULL;
  27. }
  28. static int test_mt_membarrier(void)
  29. {
  30. int i;
  31. pthread_t test_thread;
  32. pthread_create(&test_thread, NULL,
  33. test_membarrier_thread, NULL);
  34. pthread_mutex_lock(&test_membarrier_thread_mutex);
  35. while (!thread_ready)
  36. pthread_cond_wait(&test_membarrier_thread_cond,
  37. &test_membarrier_thread_mutex);
  38. pthread_mutex_unlock(&test_membarrier_thread_mutex);
  39. test_membarrier_fail();
  40. test_membarrier_success();
  41. pthread_mutex_lock(&test_membarrier_thread_mutex);
  42. thread_quit = 1;
  43. pthread_cond_broadcast(&test_membarrier_thread_cond);
  44. pthread_mutex_unlock(&test_membarrier_thread_mutex);
  45. pthread_join(test_thread, NULL);
  46. return 0;
  47. }
  48. int main(int argc, char **argv)
  49. {
  50. ksft_print_header();
  51. ksft_set_plan(16);
  52. test_membarrier_query();
  53. /* Multi-threaded */
  54. test_mt_membarrier();
  55. ksft_exit_pass();
  56. }