brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 4e14dba Raw
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