xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/appendix-a/a.40.1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* { dg-do compile } */
2*404b540aSrobert 
3*404b540aSrobert #include <omp.h>
4*404b540aSrobert typedef struct
5*404b540aSrobert {
6*404b540aSrobert   int a, b;
7*404b540aSrobert   omp_nest_lock_t lck;
8*404b540aSrobert } pair;
9*404b540aSrobert int work1 ();
10*404b540aSrobert int work2 ();
11*404b540aSrobert int work3 ();
12*404b540aSrobert void
incr_a(pair * p,int a)13*404b540aSrobert incr_a (pair * p, int a)
14*404b540aSrobert {
15*404b540aSrobert   /* Called only from incr_pair, no need to lock. */
16*404b540aSrobert   p->a += a;
17*404b540aSrobert }
18*404b540aSrobert 
19*404b540aSrobert void
incr_b(pair * p,int b)20*404b540aSrobert incr_b (pair * p, int b)
21*404b540aSrobert {
22*404b540aSrobert   /* Called both from incr_pair and elsewhere, */
23*404b540aSrobert   /* so need a nestable lock. */
24*404b540aSrobert   omp_set_nest_lock (&p->lck);
25*404b540aSrobert   p->b += b;
26*404b540aSrobert   omp_unset_nest_lock (&p->lck);
27*404b540aSrobert }
28*404b540aSrobert 
29*404b540aSrobert void
incr_pair(pair * p,int a,int b)30*404b540aSrobert incr_pair (pair * p, int a, int b)
31*404b540aSrobert {
32*404b540aSrobert   omp_set_nest_lock (&p->lck);
33*404b540aSrobert   incr_a (p, a);
34*404b540aSrobert   incr_b (p, b);
35*404b540aSrobert   omp_unset_nest_lock (&p->lck);
36*404b540aSrobert }
37*404b540aSrobert 
38*404b540aSrobert void
a40(pair * p)39*404b540aSrobert a40 (pair * p)
40*404b540aSrobert {
41*404b540aSrobert #pragma omp parallel sections
42*404b540aSrobert   {
43*404b540aSrobert #pragma omp section
44*404b540aSrobert     incr_pair (p, work1 (), work2 ());
45*404b540aSrobert #pragma omp section
46*404b540aSrobert     incr_b (p, work3 ());
47*404b540aSrobert   }
48*404b540aSrobert }
49