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