membarrier_test_multi_thread.c (1707B)
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 10#include "membarrier_test_impl.h" 11 12static int thread_ready, thread_quit; 13static pthread_mutex_t test_membarrier_thread_mutex = 14 PTHREAD_MUTEX_INITIALIZER; 15static pthread_cond_t test_membarrier_thread_cond = 16 PTHREAD_COND_INITIALIZER; 17 18void *test_membarrier_thread(void *arg) 19{ 20 pthread_mutex_lock(&test_membarrier_thread_mutex); 21 thread_ready = 1; 22 pthread_cond_broadcast(&test_membarrier_thread_cond); 23 pthread_mutex_unlock(&test_membarrier_thread_mutex); 24 25 pthread_mutex_lock(&test_membarrier_thread_mutex); 26 while (!thread_quit) 27 pthread_cond_wait(&test_membarrier_thread_cond, 28 &test_membarrier_thread_mutex); 29 pthread_mutex_unlock(&test_membarrier_thread_mutex); 30 31 return NULL; 32} 33 34static int test_mt_membarrier(void) 35{ 36 int i; 37 pthread_t test_thread; 38 39 pthread_create(&test_thread, NULL, 40 test_membarrier_thread, NULL); 41 42 pthread_mutex_lock(&test_membarrier_thread_mutex); 43 while (!thread_ready) 44 pthread_cond_wait(&test_membarrier_thread_cond, 45 &test_membarrier_thread_mutex); 46 pthread_mutex_unlock(&test_membarrier_thread_mutex); 47 48 test_membarrier_fail(); 49 50 test_membarrier_success(); 51 52 pthread_mutex_lock(&test_membarrier_thread_mutex); 53 thread_quit = 1; 54 pthread_cond_broadcast(&test_membarrier_thread_cond); 55 pthread_mutex_unlock(&test_membarrier_thread_mutex); 56 57 pthread_join(test_thread, NULL); 58 59 return 0; 60} 61 62int main(int argc, char **argv) 63{ 64 ksft_print_header(); 65 ksft_set_plan(13); 66 67 test_membarrier_query(); 68 69 /* Multi-threaded */ 70 test_mt_membarrier(); 71 72 return ksft_exit_pass(); 73}