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