1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00
linux/tools/testing/selftests/membarrier/membarrier_test_multi_thread.c
Nathan Chancellor a9c91ecddc selftests: membarrier: ksft_exit_pass() does not return
After commit f7d5bcd35d ("selftests: kselftest: Mark functions that
unconditionally call exit() as __noreturn"), ksft_exit_...() functions
are marked as __noreturn, which means the return type should not be
'int' but 'void' because they are not returning anything (and never were
since exit() has always been called).

To facilitate updating the return type of these functions, remove
'return' before the calls to ksft_exit_pass(), as __noreturn prevents
the compiler from warning that a caller of ksft_exit_pass() does not
return a value because the program will terminate upon calling these
functions.

Reviewed-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2024-05-06 13:57:20 -06:00

73 lines
1.7 KiB
C

// SPDX-License-Identifier: GPL-2.0
#define _GNU_SOURCE
#include <linux/membarrier.h>
#include <syscall.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include "membarrier_test_impl.h"
static int thread_ready, thread_quit;
static pthread_mutex_t test_membarrier_thread_mutex =
PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t test_membarrier_thread_cond =
PTHREAD_COND_INITIALIZER;
void *test_membarrier_thread(void *arg)
{
pthread_mutex_lock(&test_membarrier_thread_mutex);
thread_ready = 1;
pthread_cond_broadcast(&test_membarrier_thread_cond);
pthread_mutex_unlock(&test_membarrier_thread_mutex);
pthread_mutex_lock(&test_membarrier_thread_mutex);
while (!thread_quit)
pthread_cond_wait(&test_membarrier_thread_cond,
&test_membarrier_thread_mutex);
pthread_mutex_unlock(&test_membarrier_thread_mutex);
return NULL;
}
static int test_mt_membarrier(void)
{
int i;
pthread_t test_thread;
pthread_create(&test_thread, NULL,
test_membarrier_thread, NULL);
pthread_mutex_lock(&test_membarrier_thread_mutex);
while (!thread_ready)
pthread_cond_wait(&test_membarrier_thread_cond,
&test_membarrier_thread_mutex);
pthread_mutex_unlock(&test_membarrier_thread_mutex);
test_membarrier_fail();
test_membarrier_success();
pthread_mutex_lock(&test_membarrier_thread_mutex);
thread_quit = 1;
pthread_cond_broadcast(&test_membarrier_thread_cond);
pthread_mutex_unlock(&test_membarrier_thread_mutex);
pthread_join(test_thread, NULL);
return 0;
}
int main(int argc, char **argv)
{
ksft_print_header();
ksft_set_plan(16);
test_membarrier_query();
/* Multi-threaded */
test_mt_membarrier();
ksft_exit_pass();
}