74 lines · c
1// SPDX-License-Identifier: GPL-2.02#define _GNU_SOURCE3#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(16);66 67 test_membarrier_query();68 69 /* Multi-threaded */70 test_mt_membarrier();71 72 ksft_exit_pass();73}74