123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- /* { dg-do compile } */
- #include <omp.h>
- typedef struct
- {
- int a, b;
- omp_nest_lock_t lck;
- } pair;
- int work1 ();
- int work2 ();
- int work3 ();
- void
- incr_a (pair * p, int a)
- {
- /* Called only from incr_pair, no need to lock. */
- p->a += a;
- }
- void
- incr_b (pair * p, int b)
- {
- /* Called both from incr_pair and elsewhere, */
- /* so need a nestable lock. */
- omp_set_nest_lock (&p->lck);
- p->b += b;
- omp_unset_nest_lock (&p->lck);
- }
- void
- incr_pair (pair * p, int a, int b)
- {
- omp_set_nest_lock (&p->lck);
- incr_a (p, a);
- incr_b (p, b);
- omp_unset_nest_lock (&p->lck);
- }
- void
- a40 (pair * p)
- {
- #pragma omp parallel sections
- {
- #pragma omp section
- incr_pair (p, work1 (), work2 ());
- #pragma omp section
- incr_b (p, work3 ());
- }
- }
|