| // { 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 (); |
| } |