00001 extern void abort (void); 00002 00003 int a = 18; 00004 00005 void 00006 f1 (int i, int j, int k) 00007 { 00008 int l = 6, m = 7, n = 8; 00009 #pragma omp task private(j, m) shared(k, n) 00010 { 00011 j = 6; 00012 m = 5; 00013 if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9) 00014 #pragma omp atomic 00015 k++; 00016 } 00017 #pragma omp taskwait 00018 if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9) 00019 abort (); 00020 } 00021 00022 int v1 = 1, v2 = 2, v5 = 5; 00023 int err; 00024 00025 void 00026 f2 (void) 00027 { 00028 int v3 = 3; 00029 #pragma omp sections private (v1) firstprivate (v2) 00030 { 00031 #pragma omp section 00032 { 00033 int v4 = 4; 00034 v1 = 7; 00035 #pragma omp task 00036 { 00037 if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6) 00038 err = 1; 00039 } 00040 #pragma omp taskwait 00041 if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6) 00042 abort (); 00043 if (err) 00044 abort (); 00045 } 00046 } 00047 } 00048 00049 void 00050 f3 (int i, int j, int k) 00051 { 00052 int l = 6, m = 7, n = 8; 00053 #pragma omp task private(j, m) shared(k, n) untied 00054 { 00055 j = 6; 00056 m = 5; 00057 if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9) 00058 #pragma omp atomic 00059 k++; 00060 } 00061 #pragma omp taskwait 00062 if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9) 00063 abort (); 00064 } 00065 00066 int 00067 main (void) 00068 { 00069 f1 (8, 26, 0); 00070 f2 (); 00071 a = 18; 00072 f3 (8, 26, 0); 00073 a = 18; 00074 #pragma omp parallel num_threads(4) 00075 { 00076 #pragma omp master 00077 { 00078 f1 (8, 26, 0); 00079 a = 18; 00080 f3 (8, 26, 0); 00081 } 00082 } 00083 return 0; 00084 }