1 extern
2 #ifdef __cplusplus
3 "C"
4 #endif
5 void abort (void);
6
7 void
8 foo (int i, char *j)
9 {
10 #pragma omp atomic
11 j[i]++;
12 #pragma omp ordered threads
13 {
14 int t;
15 #pragma omp atomic read
16 t = j[i];
17 if (t != 3)
18 abort ();
19 if (i > 1)
20 {
21 #pragma omp atomic read
22 t = j[i - 1];
23 if (t == 2)
24 abort ();
25 }
26 if (i < 127)
27 {
28 #pragma omp atomic read
29 t = j[i + 1];
30 if (t == 4)
31 abort ();
32 }
33 }
34 #pragma omp atomic
35 j[i]++;
36 }
37
38 int
39 main ()
40 {
41 int i;
42 char j[128];
43 #pragma omp parallel
44 {
45 #pragma omp for
46 for (i = 0; i < 128; i++)
47 j[i] = 0;
48 #pragma omp for ordered schedule(dynamic, 1)
49 for (i = 0; i < 128; i++)
50 {
51 #pragma omp atomic
52 j[i]++;
53 #pragma omp ordered threads
54 {
55 int t;
56 #pragma omp atomic read
57 t = j[i];
58 if (t != 1)
59 abort ();
60 if (i > 1)
61 {
62 #pragma omp atomic read
63 t = j[i - 1];
64 if (t == 0)
65 abort ();
66 }
67 if (i < 127)
68 {
69 #pragma omp atomic read
70 t = j[i + 1];
71 if (t == 2)
72 abort ();
73 }
74 }
75 #pragma omp atomic
76 j[i]++;
77 }
78 #pragma omp for ordered schedule(static, 1)
79 for (i = 0; i < 128; i++)
80 foo (i, j);
81 }
82 return 0;
83 }