testsuite/libgomp.c++/ctor-3.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 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 }

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