root/tools/testing/selftests/membarrier/membarrier_test_multi_thread.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. test_membarrier_thread
  2. test_mt_membarrier
  3. main

   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 
  12 static int thread_ready, thread_quit;
  13 static pthread_mutex_t test_membarrier_thread_mutex =
  14         PTHREAD_MUTEX_INITIALIZER;
  15 static pthread_cond_t test_membarrier_thread_cond =
  16         PTHREAD_COND_INITIALIZER;
  17 
  18 void *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 
  34 static 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 
  62 int 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 }

/* [<][>][^][v][top][bottom][index][help] */