1 // { dg-do run }
2 // { dg-set-target-env-var OMP_CANCELLATION "true" }
3
4 #include <unistd.h>
5 #include <omp.h>
6 #include "cancel-test.h"
7
8 static void
foo(int * x)9 foo (int *x)
10 {
11 S a, b, c;
12 #pragma omp parallel firstprivate(x, c) num_threads (32) private (b)
13 {
14 S d;
15 b.bump ();
16 c.bump ();
17 int thr = omp_get_thread_num ();
18 switch (x[thr])
19 {
20 case 4:;
21 #pragma omp cancel parallel
22 break;
23 case 3:
24 #pragma omp task
25 usleep (1000);
26 #pragma omp task
27 usleep (2000);
28 #pragma omp task
29 usleep (4000);
30 break;
31 case 2:
32 usleep (1000);
33 /* FALLTHRU */
34 case 1:;
35 #pragma omp cancellation point parallel
36 break;
37 }
38 #pragma omp barrier
39 if (omp_get_cancellation ())
40 abort ();
41 }
42 }
43
44 int
main()45 main ()
46 {
47 int i, j, x[32] = { 0, 1, 2, 4, 2, 2, 1, 0 };
48 foo (x);
49 for (i = 0; i < 32; i++)
50 {
51 for (j = 0; j < 32; j++)
52 x[j] = rand () & 3;
53 x[rand () & 31] = 4;
54 foo (x);
55 }
56 S::verify ();
57 }
58