• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %libomp-compile-and-run
2 
3 // This test is known to be fragile on NetBSD kernel at the moment,
4 // https://bugs.llvm.org/show_bug.cgi?id=42020.
5 // UNSUPPORTED: netbsd
6 #include <stdio.h>
7 #include <math.h>
8 #include "omp_testsuite.h"
9 #include "omp_my_sleep.h"
10 
test_omp_taskwait()11 int test_omp_taskwait()
12 {
13   int result1 = 0;   /* Stores number of not finished tasks after the taskwait */
14   int result2 = 0;   /* Stores number of wrong array elements at the end */
15   int array[NUM_TASKS];
16   int i;
17 
18   /* fill array */
19   for (i = 0; i < NUM_TASKS; i++)
20     array[i] = 0;
21 
22   #pragma omp parallel
23   {
24     #pragma omp single
25     {
26       for (i = 0; i < NUM_TASKS; i++) {
27         /* First we have to store the value of the loop index in a new variable
28          * which will be private for each task because otherwise it will be overwritten
29          * if the execution of the task takes longer than the time which is needed to
30          * enter the next step of the loop!
31          */
32         int myi;
33         myi = i;
34         #pragma omp task
35         {
36           my_sleep (SLEEPTIME);
37           array[myi] = 1;
38         } /* end of omp task */
39       } /* end of for */
40       #pragma omp taskwait
41       /* check if all tasks were finished */
42       for (i = 0; i < NUM_TASKS; i++)
43         if (array[i] != 1)
44           result1++;
45 
46       /* generate some more tasks which now shall overwrite
47        * the values in the tids array */
48       for (i = 0; i < NUM_TASKS; i++) {
49         int myi;
50         myi = i;
51         #pragma omp task
52         {
53           array[myi] = 2;
54         } /* end of omp task */
55       } /* end of for */
56     } /* end of single */
57   } /*end of parallel */
58 
59   /* final check, if all array elements contain the right values: */
60   for (i = 0; i < NUM_TASKS; i++) {
61     if (array[i] != 2)
62       result2++;
63   }
64   return ((result1 == 0) && (result2 == 0));
65 }
66 
main()67 int main()
68 {
69   int i;
70   int num_failed=0;
71 
72   for(i = 0; i < REPETITIONS; i++) {
73     if(!test_omp_taskwait()) {
74       num_failed++;
75     }
76   }
77   return num_failed;
78 }
79