xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/lib-1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert #include <stdlib.h>
2*404b540aSrobert #include <omp.h>
3*404b540aSrobert 
4*404b540aSrobert int
main(void)5*404b540aSrobert main (void)
6*404b540aSrobert {
7*404b540aSrobert   double d, e;
8*404b540aSrobert   int l;
9*404b540aSrobert   omp_lock_t lck;
10*404b540aSrobert   omp_nest_lock_t nlck;
11*404b540aSrobert 
12*404b540aSrobert   d = omp_get_wtime ();
13*404b540aSrobert 
14*404b540aSrobert   omp_init_lock (&lck);
15*404b540aSrobert   omp_set_lock (&lck);
16*404b540aSrobert   if (omp_test_lock (&lck))
17*404b540aSrobert     abort ();
18*404b540aSrobert   omp_unset_lock (&lck);
19*404b540aSrobert   if (! omp_test_lock (&lck))
20*404b540aSrobert     abort ();
21*404b540aSrobert   if (omp_test_lock (&lck))
22*404b540aSrobert     abort ();
23*404b540aSrobert   omp_unset_lock (&lck);
24*404b540aSrobert   omp_destroy_lock (&lck);
25*404b540aSrobert 
26*404b540aSrobert   omp_init_nest_lock (&nlck);
27*404b540aSrobert   if (omp_test_nest_lock (&nlck) != 1)
28*404b540aSrobert     abort ();
29*404b540aSrobert   omp_set_nest_lock (&nlck);
30*404b540aSrobert   if (omp_test_nest_lock (&nlck) != 3)
31*404b540aSrobert     abort ();
32*404b540aSrobert   omp_unset_nest_lock (&nlck);
33*404b540aSrobert   omp_unset_nest_lock (&nlck);
34*404b540aSrobert   if (omp_test_nest_lock (&nlck) != 2)
35*404b540aSrobert     abort ();
36*404b540aSrobert   omp_unset_nest_lock (&nlck);
37*404b540aSrobert   omp_unset_nest_lock (&nlck);
38*404b540aSrobert   omp_destroy_nest_lock (&nlck);
39*404b540aSrobert 
40*404b540aSrobert   omp_set_dynamic (1);
41*404b540aSrobert   if (! omp_get_dynamic ())
42*404b540aSrobert     abort ();
43*404b540aSrobert   omp_set_dynamic (0);
44*404b540aSrobert   if (omp_get_dynamic ())
45*404b540aSrobert     abort ();
46*404b540aSrobert 
47*404b540aSrobert   omp_set_nested (1);
48*404b540aSrobert   if (! omp_get_nested ())
49*404b540aSrobert     abort ();
50*404b540aSrobert   omp_set_nested (0);
51*404b540aSrobert   if (omp_get_nested ())
52*404b540aSrobert     abort ();
53*404b540aSrobert 
54*404b540aSrobert   omp_set_num_threads (5);
55*404b540aSrobert   if (omp_get_num_threads () != 1)
56*404b540aSrobert     abort ();
57*404b540aSrobert   if (omp_get_max_threads () != 5)
58*404b540aSrobert     abort ();
59*404b540aSrobert   if (omp_get_thread_num () != 0)
60*404b540aSrobert     abort ();
61*404b540aSrobert   omp_set_num_threads (3);
62*404b540aSrobert   if (omp_get_num_threads () != 1)
63*404b540aSrobert     abort ();
64*404b540aSrobert   if (omp_get_max_threads () != 3)
65*404b540aSrobert     abort ();
66*404b540aSrobert   if (omp_get_thread_num () != 0)
67*404b540aSrobert     abort ();
68*404b540aSrobert   l = 0;
69*404b540aSrobert #pragma omp parallel reduction (|:l)
70*404b540aSrobert   {
71*404b540aSrobert     l = omp_get_num_threads () != 3;
72*404b540aSrobert     l |= omp_get_thread_num () < 0;
73*404b540aSrobert     l |= omp_get_thread_num () >= 3;
74*404b540aSrobert #pragma omp master
75*404b540aSrobert     l |= omp_get_thread_num () != 0;
76*404b540aSrobert   }
77*404b540aSrobert   if (l)
78*404b540aSrobert     abort ();
79*404b540aSrobert 
80*404b540aSrobert   if (omp_get_num_procs () <= 0)
81*404b540aSrobert     abort ();
82*404b540aSrobert   if (omp_in_parallel ())
83*404b540aSrobert     abort ();
84*404b540aSrobert #pragma omp parallel reduction (|:l)
85*404b540aSrobert   l = ! omp_in_parallel ();
86*404b540aSrobert #pragma omp parallel reduction (|:l) if (1)
87*404b540aSrobert   l = ! omp_in_parallel ();
88*404b540aSrobert 
89*404b540aSrobert   e = omp_get_wtime ();
90*404b540aSrobert   if (d > e)
91*404b540aSrobert     abort ();
92*404b540aSrobert   d = omp_get_wtick ();
93*404b540aSrobert   /* Negative precision is definitely wrong,
94*404b540aSrobert      bigger than 1s clock resolution is also strange.  */
95*404b540aSrobert   if (d <= 0 || d > 1)
96*404b540aSrobert     abort ();
97*404b540aSrobert 
98*404b540aSrobert   return 0;
99*404b540aSrobert }
100