Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
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     /* Multi-threaded */
0070     test_mt_membarrier();
0071 
0072     return ksft_exit_pass();
0073 }