testsuite/libgomp.c++/ctor-4.C

Go to the documentation of this file.
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 }

Generated on Fri Apr 5 05:38:10 2013 for Libgomp by  doxygen 1.4.7