| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // SPDX-License-Identifier: GPL-2.0
- #define _GNU_SOURCE
- #include <linux/membarrier.h>
- #include <syscall.h>
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <pthread.h>
- #include "membarrier_test_impl.h"
- static int thread_ready, thread_quit;
- static pthread_mutex_t test_membarrier_thread_mutex =
- PTHREAD_MUTEX_INITIALIZER;
- static pthread_cond_t test_membarrier_thread_cond =
- PTHREAD_COND_INITIALIZER;
- void *test_membarrier_thread(void *arg)
- {
- pthread_mutex_lock(&test_membarrier_thread_mutex);
- thread_ready = 1;
- pthread_cond_broadcast(&test_membarrier_thread_cond);
- pthread_mutex_unlock(&test_membarrier_thread_mutex);
- pthread_mutex_lock(&test_membarrier_thread_mutex);
- while (!thread_quit)
- pthread_cond_wait(&test_membarrier_thread_cond,
- &test_membarrier_thread_mutex);
- pthread_mutex_unlock(&test_membarrier_thread_mutex);
- return NULL;
- }
- static int test_mt_membarrier(void)
- {
- int i;
- pthread_t test_thread;
- pthread_create(&test_thread, NULL,
- test_membarrier_thread, NULL);
- pthread_mutex_lock(&test_membarrier_thread_mutex);
- while (!thread_ready)
- pthread_cond_wait(&test_membarrier_thread_cond,
- &test_membarrier_thread_mutex);
- pthread_mutex_unlock(&test_membarrier_thread_mutex);
- test_membarrier_fail();
- test_membarrier_success();
- pthread_mutex_lock(&test_membarrier_thread_mutex);
- thread_quit = 1;
- pthread_cond_broadcast(&test_membarrier_thread_cond);
- pthread_mutex_unlock(&test_membarrier_thread_mutex);
- pthread_join(test_thread, NULL);
- return 0;
- }
- int main(int argc, char **argv)
- {
- ksft_print_header();
- ksft_set_plan(16);
- test_membarrier_query();
- /* Multi-threaded */
- test_mt_membarrier();
- ksft_exit_pass();
- }
|