00001
00002
00003
00004 #include <omp.h>
00005
00006 extern "C" void abort ();
00007
00008 int ctor, cctor, dtor;
00009
00010 struct A
00011 {
00012 A();
00013 A(const A &);
00014 ~A();
00015 int i;
00016 };
00017
00018 A::A()
00019 {
00020 #pragma omp atomic
00021 ctor++;
00022 }
00023
00024 A::A(const A &r)
00025 {
00026 i = r.i;
00027 #pragma omp atomic
00028 cctor++;
00029 }
00030
00031 A::~A()
00032 {
00033 #pragma omp atomic
00034 dtor++;
00035 }
00036
00037 void
00038 foo (A a, A b)
00039 {
00040 int i, j = 0;
00041 #pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
00042 for (i = 0; i < 5; i++)
00043 {
00044 b.i = 5;
00045 if (a.i != 6)
00046 #pragma omp atomic
00047 j += 1;
00048 a.i = b.i + i + 6;
00049 }
00050
00051 if (j || a.i != 15)
00052 abort ();
00053 }
00054
00055 void
00056 bar ()
00057 {
00058 A a, b;
00059 a.i = 6;
00060 b.i = 7;
00061 foo (a, b);
00062 }
00063
00064 int
00065 main ()
00066 {
00067 omp_set_dynamic (false);
00068 if (ctor || cctor || dtor)
00069 abort ();
00070 bar ();
00071 if (ctor + cctor != dtor)
00072 abort ();
00073 }