| // { dg-do run } | |
| // { dg-set-target-env-var OMP_CANCELLATION "true" } | |
| #include <unistd.h> | |
| #include <omp.h> | |
| #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 (); | |
| } |