xref: /llvm-project/openmp/runtime/test/lock/omp_test_lock.c (revision ac7ba406edca6d17ce41bc25cef36b649a71e1d2)
1 // RUN: %libomp-compile-and-run
2 // RUN: env KMP_LOCK_KIND=tas %libomp-run
3 // RUN: env KMP_LOCK_KIND=futex %libomp-run
4 #include <stdio.h>
5 #include "omp_testsuite.h"
6 
7 omp_lock_t lck;
8 
test_omp_test_lock()9 int test_omp_test_lock()
10 {
11   int nr_threads_in_single = 0;
12   int result = 0;
13   int nr_iterations = 0;
14   int i;
15 
16   omp_init_lock (&lck);
17   #pragma omp parallel shared(lck)
18   {
19     #pragma omp for
20     for (i = 0; i < LOOPCOUNT; i++) {
21       while (!omp_test_lock (&lck))
22       {};
23       #pragma omp flush
24       nr_threads_in_single++;
25       #pragma omp flush
26       nr_iterations++;
27       nr_threads_in_single--;
28       result = result + nr_threads_in_single;
29       omp_unset_lock (&lck);
30     }
31   }
32   omp_destroy_lock(&lck);
33   return ((result == 0) && (nr_iterations == LOOPCOUNT));
34 }
35 
main()36 int main()
37 {
38   int i;
39   int num_failed=0;
40 
41   for(i = 0; i < REPETITIONS; i++) {
42     if(!test_omp_test_lock()) {
43       num_failed++;
44     }
45   }
46   return num_failed;
47 }
48