49 lines
750 B
C
49 lines
750 B
C
|
/* { 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 ());
|
||
|
}
|
||
|
}
|