1 // RUN: %libomp-compile-and-run 2 #include <stdio.h> 3 #include <math.h> 4 #include "omp_testsuite.h" 5 #include "omp_my_sleep.h" 6 test_omp_task_final()7int test_omp_task_final() 8 { 9 int tids[NUM_TASKS]; 10 int includedtids[NUM_TASKS]; 11 int i; 12 int error = 0; 13 #pragma omp parallel 14 { 15 #pragma omp single 16 { 17 for (i = 0; i < NUM_TASKS; i++) { 18 /* First we have to store the value of the loop index in a new variable 19 * which will be private for each task because otherwise it will be overwritten 20 * if the execution of the task takes longer than the time which is needed to 21 * enter the next step of the loop! 22 */ 23 int myi; 24 myi = i; 25 26 #pragma omp task final(i>=10) 27 { 28 tids[myi] = omp_get_thread_num(); 29 /* we generate included tasks for final tasks */ 30 if(myi >= 10) { 31 int included = myi; 32 #pragma omp task 33 { 34 my_sleep (SLEEPTIME); 35 includedtids[included] = omp_get_thread_num(); 36 } /* end of omp included task of the final task */ 37 my_sleep (SLEEPTIME); 38 } /* end of if it is a final task*/ 39 } /* end of omp task */ 40 } /* end of for */ 41 } /* end of single */ 42 } /*end of parallel */ 43 44 /* Now we ckeck if more than one thread executed the final task and its included task. */ 45 for (i = 10; i < NUM_TASKS; i++) { 46 if (tids[i] != includedtids[i]) { 47 error++; 48 } 49 } 50 return (error==0); 51 } /* end of check_paralel_for_private */ 52 main()53int main() 54 { 55 int i; 56 int num_failed=0; 57 58 for(i = 0; i < REPETITIONS; i++) { 59 if(!test_omp_task_final()) { 60 num_failed++; 61 } 62 } 63 return num_failed; 64 } 65 66