0001
0002 #define _GNU_SOURCE
0003 #include <linux/membarrier.h>
0004 #include <syscall.h>
0005 #include <stdio.h>
0006 #include <errno.h>
0007 #include <string.h>
0008 #include <pthread.h>
0009
0010 #include "membarrier_test_impl.h"
0011
0012 static int thread_ready, thread_quit;
0013 static pthread_mutex_t test_membarrier_thread_mutex =
0014 PTHREAD_MUTEX_INITIALIZER;
0015 static pthread_cond_t test_membarrier_thread_cond =
0016 PTHREAD_COND_INITIALIZER;
0017
0018 void *test_membarrier_thread(void *arg)
0019 {
0020 pthread_mutex_lock(&test_membarrier_thread_mutex);
0021 thread_ready = 1;
0022 pthread_cond_broadcast(&test_membarrier_thread_cond);
0023 pthread_mutex_unlock(&test_membarrier_thread_mutex);
0024
0025 pthread_mutex_lock(&test_membarrier_thread_mutex);
0026 while (!thread_quit)
0027 pthread_cond_wait(&test_membarrier_thread_cond,
0028 &test_membarrier_thread_mutex);
0029 pthread_mutex_unlock(&test_membarrier_thread_mutex);
0030
0031 return NULL;
0032 }
0033
0034 static int test_mt_membarrier(void)
0035 {
0036 int i;
0037 pthread_t test_thread;
0038
0039 pthread_create(&test_thread, NULL,
0040 test_membarrier_thread, NULL);
0041
0042 pthread_mutex_lock(&test_membarrier_thread_mutex);
0043 while (!thread_ready)
0044 pthread_cond_wait(&test_membarrier_thread_cond,
0045 &test_membarrier_thread_mutex);
0046 pthread_mutex_unlock(&test_membarrier_thread_mutex);
0047
0048 test_membarrier_fail();
0049
0050 test_membarrier_success();
0051
0052 pthread_mutex_lock(&test_membarrier_thread_mutex);
0053 thread_quit = 1;
0054 pthread_cond_broadcast(&test_membarrier_thread_cond);
0055 pthread_mutex_unlock(&test_membarrier_thread_mutex);
0056
0057 pthread_join(test_thread, NULL);
0058
0059 return 0;
0060 }
0061
0062 int main(int argc, char **argv)
0063 {
0064 ksft_print_header();
0065 ksft_set_plan(13);
0066
0067 test_membarrier_query();
0068
0069
0070 test_mt_membarrier();
0071
0072 return ksft_exit_pass();
0073 }