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