| // { dg-do run } |
| |
| #include <omp.h> |
| #include <assert.h> |
| |
| struct B |
| { |
| static int icount; |
| static int dcount; |
| static int ccount; |
| static B *e_inner; |
| static B *e_outer; |
| |
| B(); |
| B(int); |
| B(const B &); |
| ~B(); |
| B& operator=(const B &); |
| void doit(); |
| }; |
| |
| int B::icount; |
| int B::dcount; |
| int B::ccount; |
| B * B::e_inner; |
| B * B::e_outer; |
| |
| B::B() |
| { |
| #pragma omp atomic |
| icount++; |
| } |
| |
| B::B(int) |
| { |
| e_outer = this; |
| } |
| |
| B::~B() |
| { |
| #pragma omp atomic |
| dcount++; |
| } |
| |
| B& B::operator= (const B &b) |
| { |
| assert (&b == e_inner); |
| assert (this == e_outer); |
| #pragma omp atomic |
| ccount++; |
| return *this; |
| } |
| |
| void B::doit() |
| { |
| #pragma omp critical |
| { |
| assert (e_inner == 0); |
| e_inner = this; |
| } |
| } |
| |
| static int nthreads; |
| |
| void foo() |
| { |
| B b(0); |
| |
| #pragma omp parallel sections lastprivate(b) |
| { |
| #pragma omp section |
| nthreads = omp_get_num_threads (); |
| #pragma omp section |
| b.doit (); |
| } |
| } |
| |
| int main() |
| { |
| omp_set_dynamic (0); |
| omp_set_num_threads (4); |
| foo(); |
| |
| assert (B::ccount == 1); |
| assert (B::icount == nthreads); |
| assert (B::dcount == nthreads+1); |
| |
| return 0; |
| } |