xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/appendix-a/a.2.1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* { dg-do run } */
2*404b540aSrobert 
3*404b540aSrobert #include <stdio.h>
4*404b540aSrobert #include <omp.h>
5*404b540aSrobert extern void abort (void);
6*404b540aSrobert int
main()7*404b540aSrobert main ()
8*404b540aSrobert {
9*404b540aSrobert   int bad, x;
10*404b540aSrobert   x = 2;
11*404b540aSrobert   bad = 0;
12*404b540aSrobert #pragma omp parallel num_threads(2) shared(x, bad)
13*404b540aSrobert   {
14*404b540aSrobert     if (omp_get_thread_num () == 0)
15*404b540aSrobert       {
16*404b540aSrobert 	volatile int i;
17*404b540aSrobert 	for (i = 0; i < 100000000; i++)
18*404b540aSrobert 	  x = 5;
19*404b540aSrobert       }
20*404b540aSrobert     else
21*404b540aSrobert       {
22*404b540aSrobert 	/* Print 1: the following read of x has a race */
23*404b540aSrobert 	if (x != 2 && x != 5)
24*404b540aSrobert 	  bad = 1;
25*404b540aSrobert       }
26*404b540aSrobert #pragma omp barrier
27*404b540aSrobert     if (omp_get_thread_num () == 0)
28*404b540aSrobert       {
29*404b540aSrobert 	/* x must be 5 now.  */
30*404b540aSrobert 	if (x != 5)
31*404b540aSrobert 	  bad = 1;
32*404b540aSrobert       }
33*404b540aSrobert     else
34*404b540aSrobert       {
35*404b540aSrobert 	/* x must be 5 now.  */
36*404b540aSrobert 	if (x != 5)
37*404b540aSrobert 	  bad = 1;
38*404b540aSrobert       }
39*404b540aSrobert   }
40*404b540aSrobert 
41*404b540aSrobert   if (bad)
42*404b540aSrobert     abort ();
43*404b540aSrobert 
44*404b540aSrobert   return 0;
45*404b540aSrobert }
46