// { dg-do run } // { dg-set-target-env-var OMP_CANCELLATION "true" } #include #include #include "cancel-test.h" static void foo (int *x) { S a, b, c; #pragma omp parallel firstprivate(x, c) num_threads (32) private (b) { S d; b.bump (); c.bump (); int thr = omp_get_thread_num (); switch (x[thr]) { case 4: #pragma omp cancel parallel break; case 3: #pragma omp task usleep (1000); #pragma omp task usleep (2000); #pragma omp task usleep (4000); break; case 2: usleep (1000); /* FALLTHRU */ case 1: #pragma omp cancellation point parallel break; } #pragma omp barrier if (omp_get_cancellation ()) abort (); } } int main () { int i, j, x[32] = { 0, 1, 2, 4, 2, 2, 1, 0 }; foo (x); for (i = 0; i < 32; i++) { for (j = 0; j < 32; j++) x[j] = rand () & 3; x[rand () & 31] = 4; foo (x); } S::verify (); }