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 xcount; 00011 static B *expected; 00012 00013 B(); 00014 B(int); 00015 B(const B &); 00016 ~B(); 00017 B& operator=(const B &); 00018 void doit(); 00019 }; 00020 00021 int B::ccount; 00022 int B::dcount; 00023 int B::xcount; 00024 B * B::expected; 00025 00026 B::B(int) 00027 { 00028 expected = this; 00029 } 00030 00031 B::B(const B &b) 00032 { 00033 #pragma omp atomic 00034 ccount++; 00035 assert (&b == expected); 00036 } 00037 00038 B::~B() 00039 { 00040 #pragma omp atomic 00041 dcount++; 00042 } 00043 00044 void B::doit() 00045 { 00046 #pragma omp atomic 00047 xcount++; 00048 assert (this != expected); 00049 } 00050 00051 static int nthreads; 00052 00053 void foo() 00054 { 00055 B b(0); 00056 00057 #pragma omp parallel firstprivate(b) 00058 { 00059 #pragma omp master 00060 nthreads = omp_get_num_threads (); 00061 b.doit(); 00062 } 00063 } 00064 00065 int main() 00066 { 00067 omp_set_dynamic (0); 00068 omp_set_num_threads (4); 00069 foo(); 00070 00071 assert (B::xcount == nthreads); 00072 assert (B::ccount == nthreads); 00073 assert (B::dcount == nthreads+1); 00074 00075 return 0; 00076 }