00001 // { dg-do run } 00002 00003 #include <omp.h> 00004 #include <assert.h> 00005 00006 struct B 00007 { 00008 static int ccount; 00009 static int dcount; 00010 static int ecount; 00011 static B *e_inner; 00012 static B *e_outer; 00013 00014 B(); 00015 B(int); 00016 B(const B &); 00017 ~B(); 00018 B& operator=(const B &); 00019 void doit(); 00020 }; 00021 00022 int B::ccount; 00023 int B::dcount; 00024 int B::ecount; 00025 B * B::e_inner; 00026 B * B::e_outer; 00027 00028 B::B(int) 00029 { 00030 e_outer = this; 00031 } 00032 00033 B::B(const B &b) 00034 { 00035 assert (&b == e_outer); 00036 #pragma omp atomic 00037 ccount++; 00038 } 00039 00040 B::~B() 00041 { 00042 #pragma omp atomic 00043 dcount++; 00044 } 00045 00046 B& B::operator= (const B &b) 00047 { 00048 assert (&b == e_inner); 00049 assert (this == e_outer); 00050 #pragma omp atomic 00051 ecount++; 00052 return *this; 00053 } 00054 00055 void B::doit() 00056 { 00057 #pragma omp critical 00058 { 00059 assert (e_inner == 0); 00060 e_inner = this; 00061 } 00062 } 00063 00064 static int nthreads; 00065 00066 void foo() 00067 { 00068 B b(0); 00069 00070 #pragma omp parallel sections firstprivate(b) lastprivate(b) 00071 { 00072 #pragma omp section 00073 nthreads = omp_get_num_threads (); 00074 #pragma omp section 00075 b.doit (); 00076 } 00077 } 00078 00079 int main() 00080 { 00081 omp_set_dynamic (0); 00082 omp_set_num_threads (4); 00083 foo(); 00084 00085 assert (B::ecount == 1); 00086 assert (B::ccount == nthreads); 00087 assert (B::dcount == nthreads+1); 00088 00089 return 0; 00090 }