xref: /llvm-project/openmp/runtime/test/api/kmp_set_defaults_lock_bug.c (revision 7f976d556ac72f5063a06a475c669e1bba868167)
1*7f976d55SJonathan Peyton // RUN: %libomp-compile-and-run
2*7f976d55SJonathan Peyton #include <stdio.h>
3*7f976d55SJonathan Peyton #include "omp_testsuite.h"
4*7f976d55SJonathan Peyton /* The bug occurs if the lock table is reallocated after
5*7f976d55SJonathan Peyton    kmp_set_defaults() is called.  If the table is reallocated,
6*7f976d55SJonathan Peyton    then the lock will not point to a valid lock object after the
7*7f976d55SJonathan Peyton    kmp_set_defaults() call.*/
8*7f976d55SJonathan Peyton omp_lock_t lock;
9*7f976d55SJonathan Peyton 
test_kmp_set_defaults_lock_bug()10*7f976d55SJonathan Peyton int test_kmp_set_defaults_lock_bug()
11*7f976d55SJonathan Peyton {
12*7f976d55SJonathan Peyton   /* checks that omp_get_num_threads is equal to the number of
13*7f976d55SJonathan Peyton      threads */
14*7f976d55SJonathan Peyton   int nthreads_lib;
15*7f976d55SJonathan Peyton   int nthreads = 0;
16*7f976d55SJonathan Peyton 
17*7f976d55SJonathan Peyton   nthreads_lib = -1;
18*7f976d55SJonathan Peyton 
19*7f976d55SJonathan Peyton   #pragma omp parallel
20*7f976d55SJonathan Peyton   {
21*7f976d55SJonathan Peyton     omp_set_lock(&lock);
22*7f976d55SJonathan Peyton     nthreads++;
23*7f976d55SJonathan Peyton     omp_unset_lock(&lock);
24*7f976d55SJonathan Peyton     #pragma omp single
25*7f976d55SJonathan Peyton     {
26*7f976d55SJonathan Peyton       nthreads_lib = omp_get_num_threads ();
27*7f976d55SJonathan Peyton     }  /* end of single */
28*7f976d55SJonathan Peyton   } /* end of parallel */
29*7f976d55SJonathan Peyton   kmp_set_defaults("OMP_NUM_THREADS");
30*7f976d55SJonathan Peyton   #pragma omp parallel
31*7f976d55SJonathan Peyton   {
32*7f976d55SJonathan Peyton     omp_set_lock(&lock);
33*7f976d55SJonathan Peyton     nthreads++;
34*7f976d55SJonathan Peyton     omp_unset_lock(&lock);
35*7f976d55SJonathan Peyton   } /* end of parallel */
36*7f976d55SJonathan Peyton 
37*7f976d55SJonathan Peyton   return (nthreads == 2*nthreads_lib);
38*7f976d55SJonathan Peyton }
39*7f976d55SJonathan Peyton 
main()40*7f976d55SJonathan Peyton int main()
41*7f976d55SJonathan Peyton {
42*7f976d55SJonathan Peyton   int i;
43*7f976d55SJonathan Peyton   int num_failed=0;
44*7f976d55SJonathan Peyton   omp_init_lock(&lock);
45*7f976d55SJonathan Peyton 
46*7f976d55SJonathan Peyton   for(i = 0; i < REPETITIONS; i++) {
47*7f976d55SJonathan Peyton     if(!test_kmp_set_defaults_lock_bug()) {
48*7f976d55SJonathan Peyton       num_failed++;
49*7f976d55SJonathan Peyton     }
50*7f976d55SJonathan Peyton   }
51*7f976d55SJonathan Peyton   omp_destroy_lock(&lock);
52*7f976d55SJonathan Peyton   return num_failed;
53*7f976d55SJonathan Peyton }
54